到目前为止做了两个linux的spi设备,一个是一个mp3解码芯片vs1003,另一个是一个VFD 荧光屏,其中vs1003使用的arm自带的spi控制器驱动,VFD屏使用的GPIO模拟SPI实现的。这两个驱动都没有使用内核中的spi子系统框架,而是单独做了一个字符设备,当初因为感觉内核中的spi子系统太庞大,对其也不算太熟,而且这两个驱动并不是很大,所以就单独实现了。对与SPI本身来说,其实很简单,就是四种模式,掌握好什么时候发数据,什么时候读取数据,按照时序操作,通讯问题应该不大。在这两个驱动中遇到了以下一些问题,都是相当初级的,现在想想真低级
1.一个是对spi控制器进行初始化的时候,寄存器是16位的,而我把代表寄存器的变量强制转换成了32位的,这样初始化肯定是错误的,spi一直工作不起来。对硬件地址的操作一定要注意这些。比如一个寄存器是8位的,地址是0x500000000,而这样操作:*(violate unsigned int *)0x500000000 = 0x10;这样操作肯定是错误的。
2.还有一个是在读取状态寄存器的时候,总是得到错误的状态,明明已经发送完了,可是读出的值却不对,这个是因为在声明的时候没有使用violate关键字。
3.在验证了程序初始化部分以及时序都正确的情况下,而通讯就是不正常,一定要敢于怀疑器件是否是好的,也许换一个器件就通了。
有时间还是有必要把内核中的spi子系统看一下