严格地说,我的SPI外围设备有问题,该板配置为SPI从机,该板发送数据以响应来自其他配置为主机的板的传入消息。
从站(STM32F407VG-发现):
void spi2_peripheral_config_init(void)
{
LL_SPI_InitTypeDef spi2_peripheral_config = {
.TransferDirection = LL_SPI_FULL_DUPLEX,
.Mode = LL_SPI_MODE_SLAVE,
.DataWidth = LL_SPI_DATAWIDTH_8BIT,
.ClockPolarity = LL_SPI_POLARITY_LOW,
.ClockPhase = LL_SPI_PHASE_1EDGE,
.NSS = LL_SPI_NSS_HARD_INPUT,
.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2,
.BitOrder = LL_SPI_MSB_FIRST,
.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
.CRCPoly = 0x00
};
LL_SPI_Init(SPI2, &spi2_peripheral_config);
LL_SPI_Enable(SPI2);
}
void spi2_send_data(uint8_t *tx_buffer, uint32_t bytes_to_send)
{
for (uint32_t index = 0; index < bytes_to_send; index++) {
while (LL_SPI_IsActiveFlag_TXE(SPI2) == 0) {
;
}
LL_SPI_TransmitData8(SPI2, tx_buffer[index]);
}
}
void spi2_receive_data(uint8_t *rx_buffer, uint32_t bytes_to_receive)
{
for (uint32_t index = 0; index < bytes_to_receive; index++) {
while (LL_SPI_IsActiveFlag_RXNE(SPI2) == 0) {
;
}
rx_buffer[index] = LL_SPI_ReceiveData8(SPI2);
}
}
在主应用程序内部,我有以下代码,等待主服务器的传入数据:
char received_message[17] = {0};
spi2_receive_data((uint8_t *)received_message, 17);
while (strcmp(received_message, "Hello STM32F407!") != 0) {
;
}
status_led_turn_on();
uint8_t response_code = 0x55;
while (1) {
spi2_send_data(&response_code, 1);
}
此代码正常工作,但是如果我要发送一些数据,即从设备->主设备,则MISO行会变得“怪异”,它无法发送任何数据,如果是,则完全是垃圾。下面我附上USB逻辑分析仪的图片:
我知道要从从机获取数据,主机必须提供时钟信号,这意味着主机必须发送一些虚拟数据以从从机读取数据。
但是当我从主机向从机发送一个虚拟字节时,MISO无法提供任何反馈。
什么会导致这种问题?
答案 0 :(得分:0)
非常合乎逻辑。主机总是在传输到从机时接收数据。因此,您需要先清除FIFO,然后再接收任何数据。
void spi2_receive_data(uint8_t *rx_buffer, uint32_t bytes_to_receive)
{
while(LL_SPI_IsActiveFlag_RXNE(SPI2)) LL_SPI_ReceiveData8(SPI2);
for (uint32_t index = 0; index < bytes_to_receive; index++)
{
spi2_send_data((uint8_t[]){0}, 1); // dummy send
while (LL_SPI_IsActiveFlag_RXNE(SPI2) == 0);
rx_buffer[index] = LL_SPI_ReceiveData8(SPI2);
}
}