[原创]飞思卡尔BA01B纠错
0赞BA01B 工作原理就是三个步骤:
1.先把准备访问SPBA01B内部单元的高8位地址送到它的高地址锁存器;
2.然后再轮到低8位锁存器;
3.最后你再进行需要的读或写操作。
麻烦就在于它没有片选信号,这两根状态线肯定导致了SPBA01B每时每刻肯定是在某一种工作状态下,你对数据线的每个操作都要小心,免得干扰SPBA01B或者被它干扰!!!
你可能会这样设计你的软件,下面我用伪码描述工作原理,请注意!别真的在IDE里面编译它:
1. IOA_Data = Adder_H_8; // 送上高八位地址数据
2. MC1 = 1; // 将状态设置为锁存高地址
3. MC0 = 1;
4. IOA_Data = Adder_L_8; // 送上低八位地址数据
5. MC1 = 1; // 将状态设置为锁存低地址
6. MC0 = 0;
7. IOA_Data = Data; // 送上准备写入的数据
8. MC1 = 1; // 将状态设置写数据
9. MC0 = 1
如果你的软件真的这样写就完蛋了,就像准备到东方,却一直向西方走,而且不是在地球上,还能绕回来。就像困在一个无边的二维世界里,永远到不了你想去的地方。
为何呢?因为数据并没有正确锁存到地址寄存器,而且写入扩展存储器或者SPBA01B寄存器的数据是随机数!
这种情况是怎么产生的呢?就是因为SPBA01B采用了上升沿锁存机制。纯做软件的朋友可能不太明白这个工作原理,学过逻辑电路的朋友就明白了。不明白不要紧,看看我们应该怎样正确的做就行了。
上面的伪代码有两个毛病,正确的软件编写方式应该如下:
1. MC1=1; // 首先设定为写高地址模式
2. MC0=1;
3. IOA_Data = Adder_H_8; // 送上高八位地址数据
4. MC1=1; // 再设为写低地址模式,注意:由于在这里信号线的跳变,高八位地址同时被正确锁存到高地址寄存器中了
5. MC0=0;
6. IOA_Data = Adder_L_8; // 再送上低八位地址
7. MC1=0; // 设定为写数据模式,注意:由于在这里信号线的跳变,低八位地址同时被正确锁存到高地址寄存器中了
8. MC0=0;
9. IOA_Data = Data; // 送上准备写入的数据。!!!!!注意:这里很关键的一点,很多人会忽略掉!!!!!数据是送上数据线了,但是还没有开始真正的写操作!!!!!需要将信号线跳变一下,确保写操作开始执行,数据正确写入该去的地方!!!!!
10. MC1=1; // 这里就是跳变信号,确保上面的写操作正确执行。
11. MC0=1;
你可能会担心,信号又跳回锁存高地址模式,会不会造成不良影响啊???那么~~~ 接吻会不会怀孕啊???其实这就是告诉你的答案!当然不会有影响啦!因为只要MC1和MC0保持那个状态不变,指定的模式也就没有真正开始执行!所以不会改变高地址。两个人拖拖手、亲亲嘴,你别开始玩真刀真枪的,哪里会有BB啊???
烦啊!你明白为何我讨厌这种双线操作了吧。有没有办法关闭这个讨厌的四个指定状态呢?免得不小心对SPBA01B误操作了。有,肯定有,而且方法很多,但不花钱的办法可能只有一个,和老太太的裹脚布一样,又臭又长。记得前面说过的ID号吗?就它管用,往这个寄存器里面写一个和它不一致的ID号,它就立刻休息了。需要它的时候,再写回它自己的ID号就行了,它立马又活蹦乱跳了。这个功能是设计给级联的需求使用的,这里可以借用,明白了吧!如果不懂级联是什么?那么好好看看DataSheet就知道了。
假如你嫌烦,不愿看DataSheet,那我就简单介绍一下:SPBA01B是可以串接起来工作的,最多可以串七个,它们共享MC1和MC0控制线。为了保证它们正常工作不打架,每个SPBA01有自己的专用ID号,不能和其它重复(否则那就乱来了)。第一个SPBA01B的CI信号接到CPU的IO上,然后有个CO信号接到下一片SPBA01B的CI上,该片的Co再接到第三级的CI上,如此这般...一直连到第七个。
当CPU开始对SPBA01B复位时,第一片复位了,等待CPU写一个ID号给它,写完成后,这个ID号在后面的工作中就不能改了,直到你关闭电源(再用CI信号来次复位后重写呢?我忘记做试验了,有兴趣的朋友试试看吧)。然后,如果你再次写入ID号的时候,它开始比较,如果ID号相同,表示你确定要求它是活动的,否则,你是选择另外的SPBA01B,这时候,它开始传递CI信号到第二个SPBA01B(通过它的CO到第二片的CI),然后它睡了。第二个开始确认,如果没写过ID,就把ID号当作自己的名份保存起来(快抢啊!谁愿意做名份最小的?)。如果自己是写过ID的,那么它就比较ID号,重复第一片同样的工作......这样就把所有的ID号权设置完了,最后设置完的保持活动状态,其它全部睡着了。幸好SPBA01B不会吃醋,不然下面几级全部饿死了......!!!如果你需要唤醒某个开始工作,则写ID号到ID号寄存器,对上号的马上醒来,刚才那个又睡去了!!!