数据总线上要连接多个扩展的外围芯片,而某一时刻只能由有一个有效的数据传输通道。具体那一个芯片的数据通道有效,是由各个芯片的片选信号控制选择的。欲使CPU与某个外部芯片交换数据,则CPU必须先通过地址总线发现该芯片的地址(怎么发现)(当对外设对应的地址进行读写操作时,地址总线上的状态就是外设的地址,所以可以使片选信号有效),使该芯片的片选信号有效,此时数据总线上的数据只能在CPU和该芯片之间进行传送。
计算机系统中,凡需要进行读写操作的部件都存在编址的问题。存储器的每个单元均有自己的地址,对于I/O接口,则需要对接口中的每个端口进行编址。通常采用两种编址方法:一种是独立编址,另一种是统一编址。
CUP根据地址访问外部扩展器件,即由系统地址线上送出的地址信息选中某一单元进行读写。要使应用系统有条不紊地工作,使任意时刻系统总线上只有一个有效的数据传输通道,就必须正确设置各工作芯片的片选/使能信号的产生问题。即系统地址空间的分配问题。若某芯片内部还有多个可寻址单元,则称为片内寻址。在逻辑上,芯片的选择是由系统的高位地址线通过译码实现的,片内寻址直接由系统低位地址信息确定。把芯片的地址引线按位号与相应的系统地址总线直接连接即可实现片内寻址。
问题:地址总线信号怎么送出进行片选的,具体通过程序怎么实现的?初步想法就是通过当前操作指令,对哪个地址进行操作,然后会有地址锁存器把当前操作的地址锁存,地址锁存器中的地址与地址总线上的状态时一致的。不知道正确与否?
经过学习,总结如下:地址总线上的状态和当前程序操作的地址是相对应的,即当前对0x8a地址进行读写操作,地址总线上的状态就是0x8a,
例如:进行写操作
#define NAND_CLE 0x08000002
void NFWrCmd(int cmd)
{
*(volatile U8 *)NAND_CLE=cmd;
}
这时地址总线上的地址(状态)为0x08000001 控制外设的地址信号
读操作: #define NAND_DAT 0x08000000
void NFRdDat(void)
{
return *(volatile U8*) NAND_DAT;
}
读取地址中的内容,就是外设输出到总线上的数据。
有时在读写操作时芯片硬件会自动进行地址指针加减,所以在写数据时对同一个地址进行写,也不会覆盖掉上一次写入的数据。