爱悠闲 > Q24Plus OpenAT SPI 存取

Q24Plus OpenAT SPI 存取

分类: OpenAT  |  标签: struct,flash,io,存储,产品,c  |  作者: xunpo 相关  |  发布日期 : 2014-09-02  |  热度 : 312°

 

前后花了大半个月弄这个spi的事情,总体情况看来,走过的路不顺利,但最后还是达到了目的。

q24plus提供了一个 三线spi (IO/CLK/EN),IO可以由bus自动控制为输入状态或者输出状态,使能也由函数控制,时钟根据配置设置

,最大13Mhz,最小 812.5Khz。支持SPI 模式0,模式3。

我最初打算是外接SD卡,不过经过这么长时间的调试,暂时放弃了这一想法,待有时间后我再回头来做关于sd方面的研究。

一般 SPI 的存储芯片是在上升沿发数据,下降沿读数据,但由于wavecom提供的spi函数原因,我选择在上升沿同时收发数据,但这样会导致

数据接收不稳定的问题,所以,通信时钟不能太快了,太快就会错位。

关于 SPI / I2C 操作时的一个结构体定义:
typedef struct
{
u32 Address;
u32 Opcode;
u8 OpcodeLength;
u8 AddressLength;
u8 AccessSize; (reserved for future products)
} adl_busAccess

对于这个结构体,很多人都不知怎么用,SDK讲解也不详细,搜了很多资料,也问了很多人,终于弄清了,下面我无偿奉献给大家:
Address:32位地址
Opcode:操作码
OpcodeLength:操作码长度
AddressLength:地址长度
AccessSize:此版本不用

不管我们在使用 adl_busRead 还是 adl_busWrite 都会将这个结构体里的数据做为第一个发送,后面的参数做第二个时钟周期发送,整

个发送期间,时钟一直有效,不会停顿,同时,使能会一直处于低。


s8 adl_busRead (u8 Handle,adl_busAccess_t *pAccessMode,u32 DataLen,void * Data );

返回值:读取是否成功,实际上,这里的成功与否是对于你的配置而言的,芯片最终返回的数据都存在 Data中了.
执行顺序:

初始化时钟
使能
发送 操作码 ,操作码的长度根据 OpcodeLength指定,请注意了,这里是从高位发起的,同时数据类型是 u32,所以,如果小于32位,

请作一下处理,如果操作码长度设为0 这里就不发了;
发送地址,地址发送长度是由 AddressLength指定的,其发送方式同操作码。

根据 DataLen 长度 发 DataLen*8个时钟周期,同时将读到的数据存入 Data所指向的内存中。

至此,读取操作完成

s8 adl_busWrite ( u8 Handle,adl_busAccess_t * pAccessMode,u32 DataLen,void * Data );

返回值:写操作是否成功,实际上,这里的成功与否是对于你的配置而言的.
执行顺序:

初始化时钟
使能
发送 操作码 ,操作码的长度根据 OpcodeLength指定,请注意了,这里是从高位发起的,同时数据类型是 u32,所以,如果小于32位,

请作一下处理,如果操作码长度设为0 这里就不发了;
发送地址,地址发送长度是由 AddressLength指定的,其发送方式同操作码。

根据 DataLen 长度 发 DataLen*8个时钟周期,同时将 Data 指向的数据通过 IO 输出,每时钟周期 输出 1位。

至此,写入操作完成


我目前接了一个 32Mbit 的flash,读写操作都已顺利调通,作个记念。


Q24Plus的研究将告一个段落了,模块没有什么新功能需要处理,同时由于这款产品本身的原因,也没有多少继续往下开发的价值,下一步我

研究的对象是Q2686,这个模块给我们带来了全新的体验.
ARM9 处理器,2个独立的 4 线SPI 1个独立的I2C,可达 3.4Mbit,高达 100个 GPIO 引脚,最关键的是与3G是PIN2PIN兼容的.