在CCES环境下,ADI 自带了驱动接口函数,为驱动调试省下一大杯子事;但是这为人熟知的SPI,在调试过程中还是遇到了挫折,几度想撞墙;
最大的折磨:死机。 实际的SPI驱动接口是全双工功能的,所以传输完成后,接口函数的返回值是ADI_SPI_TRANSCEIVER_PROCESSED,没有区分是发送完成还是接收完成;我的应用只需要半双工就可以了,按我的思路,是需要区分的,所以,我在驱动的StartInterruptTransceiver()函数里做了修改,判断如果提交的接收buffer是NULL时,只使能transmit;如果提交的发送buffer是NULL时,只使能resecver;这本来毫无争议,实际上这是对驱动的一种优化;但当发送21个字节时,系统崩溃了,PC指针留在出中断,返回主函数时,很像堆栈溢出,查找每个流程和函数,没有发现任何原因,人都快崩溃了;一个偶然的机会,找到了原因,跟代码毫无关系,是由于CCES没有配置使用外部128MB的RAM,导致内存不足,系统崩溃;
第二个bug:丢数据。 发送8字节以上的帧,会插入0X00,经琢磨,想到是总线速度太慢的问题(之前是50MHz,SPI波特率是25MHz,slave模式),总线改为25MHz,丢的字节更多了;改为最大的200MHz,居然还是丢;最终放弃了data interrupt模式,改为DMA模式,问题得解!