TLSR8258的硬件SPI支持slave模式,但是并不是很安全。因为SPI master端可以随意改写TLSR8258任意内存中的任意数据,很容易把TLSR8258搞死机。
SPI master端必须按照下面的格式发数据:
第1字节:TLSR8258内存地址第23-16位。
第2字节:TLSR8258内存地址第15-8位。
第3字节:TLSR8258内存地址第7-0位。
第4字节:传输方向。
master->slave是0x00,slave->master是0x80。
第5~n字节:具体的数据内容(可以没有这一段)。
也就是说,SPI master端必须至少发送4字节的数据。前3个字节是TLSR8258的内存地址。如果内存地址不正确,会把SRAM
里面的数据破坏掉,然后TLSR8258就会死机。所以TLSR8258 SPI的slave模式非常不安全。
SDK版本:tc_platform_sdk-V3.3.1
为了方便演示,在TLSR8258的PB2-5上用GPIO模拟SPI master,然后用杜邦线连接到PD2、PD7、PB7和PB6上的硬件SPI从机。
SPI连线:
// GPIO模拟SPI主机 ----> 硬件SPI从机
#define GPIO_SPI_MASTER_CS GPIO_PB2 // 连接TLSR8258_CS (PD2)
#define GPIO_SPI_MASTER_CLK GPIO_PB3 // 连接TLSR8258_SCLK (PD7)
#define GPIO_SPI_MASTER_MISO GPIO_PB4 // 连接TLSR8258_SDO (PB7)
#define GPIO_SPI_MASTER_MOSI GPIO_PB5 // 连接TLSR8258_SDI (PB6)
TLSR8258上开了两个缓冲区。
volatile unsigned char spi_slave_buffer[2][64] __attribute__((section(".spi_slave_buff")));
#define spi_slave_rxbuf spi_slave_buffer[0] // 接收缓冲区
#define spi_slave_txbuf spi_slave_buffer[1] // 发送缓冲区
整个spi_slave_buffer数组的大小是128字节,前64字节用作接收缓冲区,后64字节用作发送缓冲区。
打开编译后的tc_platform_sdk-V3.3.1/project/tlsr_tc32/B85/PM_Demo/PM_Demo.lst,可以看到spi_slave_buffer数组的起始地址是0x4133c。
0084133c g O .my_code 00000080 spi_slave_buffer
所以slave接收缓冲区的地址是0x4133c,slave发送缓冲区的地址是0x4133c+64=0x4137c。
master在给slave发数据的时候,slave是在接收数据,所以前三个字节为0x04,0x13,0x3c,第四个字节为0x00。
u8 data1[68] = {0x04, 0x13, 0x3c, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
master在接收slave的数据的时候,slave是在发送数据,所以前三个字节为0x04,0x13,0x7c,第四个字节为0x80。slave要提前在发送缓冲区(spi_slave_txbuf)里面放好数据内容。
u8 data2[68] = {0x04, 0x13, 0x7c, 0x80};
TLSR8258的硬件SPI只支持半双工通信。只有slave模式才支持中断
,master模式是不支持中断的。
硬件SPI slave模式检测到CS上升沿后,就会触发一次中断,执行irq_handler函数。但是在函数中,没有办法判断master端的传输方向,也没有办法获取数据的长度。