|
故障现象:只能接受第1个字节数据。
RP2040只能收到一个字节,然后阻塞到 spi_is_readable(spi)一直返回false
spi主机每次只发送1个字节,发送期间CS=0, 完毕CS=1. 如果不接CS,第1个字节也无法读取.
代码如下:
// --- SPI引脚定义---
#define SPI_CSN_PIN 10
#define SPI_SCK_PIN 18
#define SPI_TX_PIN 19
#define SPI_RX_PIN 16
#define SPI_INSTANS spi0
int TestSpiSlave(void)
{
stdio_init_all();
// Enable SPI at 125 MHz and connect to GPIOs
spi_init(SPI_INSTANS, 1 * 1000000); //
spi_set_slave(SPI_INSTANS, true); // 设置从机模式
gpio_set_function(SPI_RX_PIN, GPIO_FUNC_SPI);
gpio_set_function(SPI_CSN_PIN, GPIO_FUNC_SPI);
gpio_set_function(SPI_SCK_PIN, GPIO_FUNC_SPI);
gpio_set_function(SPI_TX_PIN, GPIO_FUNC_SPI);
static uint8_t txbuf[TEST_SIZE];
static uint8_t rxbuf[TEST_SIZE];
for (uint i = 10; i < TEST_SIZE; ++i) {
txbuf = i;
}
while (1)
{
spi_read_blocking(SPI_INSTANS, txbuf, 1);
}
return 0;
}
--------------------------
int __not_in_flash_func(spi_read_blocking)(spi_inst_t *spi, uint8_t repeated_tx_data, uint8_t *dst, size_t len) {
invalid_params_if(SPI, 0 > (int)len);
const size_t fifo_depth = 8;
size_t rx_remaining = len, tx_remaining = len;
while (rx_remaining || tx_remaining) {
if (tx_remaining && spi_is_writable(spi) && rx_remaining < tx_remaining + fifo_depth) {
spi_get_hw(spi)->dr = (uint32_t) repeated_tx_data;
--tx_remaining;
}
if (rx_remaining && spi_is_readable(spi)) { // 收到一个字节后,spi_is_readable(spi) 条件就满足了
*dst++ = (uint8_t) spi_get_hw(spi)->dr;
--rx_remaining;
}
}
return (int)len;
}
|
|