最近在ESP8266 上要搞个通讯协议与mcu 通讯 ,8266 做从机,开发的过程以及遇到的问题,记录下来,供参考。
1,首先根据需求和esp8266的spi说明文档参见esp8266-technical_reference_cn.pdf,MCU与8266 需要双向数据交互,且为了编程方便,通讯数据采用定长,最后决定采用双线透传协议通讯(有现成的例程也是重要原因,能少走弯路)
- spi 双线透传的例程在NONOS SDK 下,先把它的驱动文件 spi.c 搬到我的应用里来,我用的是RTOS SDK, 需要移植。
写了简单的测试程序。先初始化,并在接收中断里发送消息给任务。
spi_slave_init( SpiNum_HSPI, 32); 32 是数据段长度,也就是一次需要发送34 个字节才会触发接收中断。
(不要在中断处理里面)加上调试信息,先确定通讯正常,由于MCU那边还没有开发,只有自己先想办法自测试了,直接搞了USB转SPI的调试板来测,先用逻辑分析仪来验证调试工具的信号是否满足条件。如图1,一共34个字节,cmd(1)+addr(1)+data(32)
cmd为2 ,表示主机发送,addr 必须为0 ,后面数据依次1-32。 和预期一致。
然后将调试板和esp8266硬件连接,测试打印接受数据发现数据混乱,接收中断和发送中断都进去了,检查代码,看的眼花,还是先看硬件吧,一看四条线都接了,就是地线没接,不过看ESP8266 spitest 接线图也没写,加上地线以后,数据就OK了
4.继续spi从机发送调试,测试信号发现数据出错,测试发现还有点 规律-前面几个是正常的,后面就开始乱了,怀疑是时序问题,spi_slave_init ,增加MISO延时, 数据正常。如下 :
SET_PERI_REG_MASK(SPI_CTRL2(spi_no),(0x7&SPI_MISO_DELAY_NUM)<<SPI_MISO_DELA_NUM_S) ;
注意,主机接收时,cmd 为3,ADDR 为0,后面的DATA 任意,只要长度满足就可以了。