TC387实现SPI自通讯
预期效果:
TC387上定义两个SPI通讯接口,一个用于发数据一个用于收数据。准确无误的收到一次数据就对核心板led灯的状态进行一次翻转。
由于实验设备有限,只能想办法通过现有设备进行实验。
实现过程:
最开始在cpu0的主函数中撰写了两个spi的通讯接口,分别进行收发,但是实际效果并没有实现。经过思考,SPI是一种同步通讯的协议,在同一个核内编写的程序需要顺序执行,当SPI0接口发送数据时,另一个SPI1并没有同时进行数据的接收,而SPI0发送完数据后SPI1再进行接收,SPI1接收数据时候将会什么数据都收不到。
发现程序存在的问题之后,由于设备有限,考虑到TC387是一款多核芯片,可以将两个SPI接口分别交由不同的cpu执行,就可以实现数据的收发同步进行。最终效果如下所示:
cpu0代码(只是简单的SPI使用流程勿直接粘贴运行):
uint8 data = 255; //设为255的原因是希望通过MOSI去电灯判断数据传输的情况,但由于没有led灯进行调试故而放弃这个想法。
spi_init(SPI_0,SPI_MODE0,115200,SPI0_SCLK_P20_11,SPI0_MOSI_P20_14,SPI0_MISO_P20_12,SPI0_CS0_P20_8);
// 参数说明 spi_n 选择SPI模块(SPI_1-SPI_4)
// 参数说明 mode SPI模式 0:CPOL=0 CPHA=0 1:CPOL=0 CPHA=1 2:CPOL=1 CPHA=0 3:CPOL=1 CPHA=1 // 具体细节可自行查阅资料
// 参数说明 baud 设置SPI的波特率
// 参数说明 cs_pin 选择SPI片选引脚
// 参数说明 sck_pin 选择SPI时钟引脚
// 参数说明 mosi_pin 选择SPI MOSI引脚
// 参数说明 miso_pin 选择SPI MISO引脚
// 返回参数 void
spi_write_8bit(SPI_0, data);
CPU1代码:
spi_init(SPI_1,SPI_MODE0,115200,SPI1_SCLK_P10_2,SPI1_MOSI_P10_1,SPI1_MISO_P11_3,SPI1_CS1_P20_9);
while(true)
{if(spi_read_8bit(SPI_1)==255){gpio_set_level(LED1, led_state);gpio_set_level(LED2, led_state);gpio_set_level(LED3, led_state);gpio_set_level(LED4, led_state);}else{gpio_set_level(LED1, !led_state);gpio_set_level(LED2, !led_state);gpio_set_level(LED3, !led_state);gpio_set_level(LED4, !led_state);}}
本阶段收获:
- 基本掌握逐飞开源库中spi,gpio,时钟的使用方法,
实验心得:由于对逐飞科技的开源库不熟悉,利用逐飞科技开源库进行开发进度较慢,需要阅读库中代码,明白库函数使用方法及原理。
过程中遇到的不懂的地方:
- 在开源库中只提供了SPI的读和写的函数方法,对于SPI协议如果突然收到数据的情况的解决方案还不知道。目前的想法是结合开源库的中断进行完成,但对于逐飞的中断使用还没有进行了解。
- 目前我在cpu0中使用SPI0接口进行write(发送)时候,另一个cpu1的SPI1不停地进行read(接收)才能获取到数据。但如果cpu1并不是一直在进行read是不是就可能不能够接收到cpu0的数据。
- 开源库的SPI封装函数并没有SPI主从模式的设定,如果在与外部设备进行SPI通讯时,如何同时进行数据的收和发呢?
下一步的工作内容的想法:
- 使用实验室的示波器对SPI传输的数据进行观察,通过波形对实际传输的数据进行较为校验。
- 主控芯片的四个CPU正好可以为整个项目分别控制四个电磁阀的,使得电磁阀悬架对悬架的控制更为精确
- 继续研究和了解逐飞科技开源库中串口和中断的内容,方便后边项目的实现和调试。