設置 | 登錄 | 註冊

目前共有4篇帖子。

tlsr8258的spi slave模式很不安全

1樓 巨大八爪鱼 2026-2-2 14:03
因為外部主機可以隨意改寫tlsr8258裡面的任何內存地址。
如果spi傳輸出現錯誤,那麼tlsr8258很容易死機。
2樓 巨大八爪鱼 2026-2-2 14:05
3樓 巨大八爪鱼 2026-2-2 14:07

TLSR8258 SPI Slave模式收發數據的方法:

https://zhuanlan.zhihu.com/p/2000671936779403382

4樓 巨大八爪鱼 2026-2-2 14:07
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端的傳輸方向,也沒有辦法獲取數據的長度。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張