f2812内部有spi接口,外扩存储器,想对它进行访问,看了下手册,访问规则是先发一个字节写命令,再发一个字节page programe命令, 再发三个字节地址,最后发要写的数据,问题是三个字节的地址不知如何填写,spi存储器的地址是如何映射的?cpu手册没看到给spi分配存储空间啊?应该发什么地址啊?感谢回答
------解决方案--------------------
SPI 存储器地址和CPU所分配给存储器的地址是没有关系的。看看SPI存储器的数据手册就知道怎么送SPI的地址了。
------解决方案--------------------
楼主是想用SPI做外扩存储器的控制接口吧。看描述,SPI接口作为控制接口(可写)、地址接口(页地址和三个字节地址),数据接口(长度未告知)。你的描述中只给出了写的流程,没有给出读的流程。读的流程估计和写流程差不多。
你问的三个字节地址应该是外扩存储器本身的地址吧,不是SPI寄存器的地址吧,如果你有demo代码的话,里面SPI的寄存器的地址都已经在开发板对应的.h文件中定义过了,你不需要知道具体的地址吧,只需要知道对应的寄存器名字吧。关于这个地址,你应该更多的是看外扩的存储器的手册吧,SPI在这里只是作为一个通信的工具而已,只要能通信,不需要太过纠结SPI的问题吧。
你给出的外扩存储器的写流程已经很清楚了呀,先发一个字节长度的写命令,再发一个字节page programe命令,再发三个字节地址(这个是外扩的存储器所在page中的子地址吧,和CPU分配的地址无关,因为你的这个外扩的存储器地址和数据管脚不是直接接在ARM核或者是ARM CPU的专用外扩存储器的总线引脚上的),然后是要写入的数据,长度你没有标出,假设是2个字节长。其实也就是用SPI发送7个字节的数据,你配置的SPI单次发送数据的长度为8字节,用一个函数分装后void spi_send(unsigned char data);那么就是反复调用这个函数7次。三字节的地址由自己定。例如想访问外扩存储器的第2页的0x013476的话,那么那三字节地址就是0x01、0x34、0x76。不过地址的顺序和字节内的顺序需要你看看存储器的手册和SPI的手册。
------解决方案--------------------
没用过SPI, 说下GPIO的,感觉应该类似。
GPIO的需要做地址映射,首先要知道基地址 IMMR
然后GPIO对应REG的地址,都是在此基础上的偏移
将物理地址映射为可操作的内存地址
if (!request_mem_region( gpio_phy_base, gpio_len, "gpio_test"))
{
printk("gpio_test: can't get I/O mem address 0x%x\n", gpio_phy_base);
return -ENODEV;
}
gpio_virt_base = (uint32)ioremap( gpio_phy_base, gpio_len );
然后就可以操作了。 具体的可以看下我的BLOG。
------解决方案--------------------
采用SPI接口的存储器内部的每个单元都是有地址的,你说的三字节地址应该指的是存储器内单元的地址,这种存储器一般带有AAI功能,所以在需要连续存储数据时,只要给出存储的起始地址就可以了。
三字节的地址说明你用的芯片存储单元较多,在128KB~16MB之间。
比如:25010,片内128KB单元,地址为:000000H~01ffffH,假如你想存10个数据到这个存储器从2000H开始的地方去,那么就需要:先发一个字节page programe命令,再发 0x00,0x20,0x00,接下来是10个数据即可。
另外还要注意2812的输出时序的边沿变化、高低位顺序是否满足要求。