embedded - STM32 SPI MISO 保持高电平
问题描述
我正在尝试在 2 个 stm32 设备之间进行基本的 SPI 通信。HAL 用于此目的。想法是每 1 秒在 2 个 MCU 之间交换数据。所以我创建了定时器,目的是每 1 秒产生一次中断(定时器用于设置启动 SPI 通信的标志)。MCU 配置为在全双工模式下工作(1 个主设备和 1 个从设备)。
接下来是我的问题:当 SPI 配置为在较低带宽上工作时(当预分频器为 256 或 128 时),2 个 MCU 按预期进行通信。随着速度的增加,数据在 MOSI 线上收集越来越多的垃圾。基本上味噌生产线不能按预期工作。味噌线在应该低的时候保持高(看图片)。
主码:
#define SPI_SLAVE_SYNBYTE (0xAC)
#define SPI_MASTER_SYNBYTE (0x53)
bool flagSpi1 = false;
uint8_t rxSpi[10] = {0};
uint8_t txSpi[10] = "Milan";
void Synch(void)
{
uint8_t txAck = SPI_MASTER_SYNBYTE;
uint8_t rxAck = 0;
do
{
if(HAL_SPI_TransmitReceive_DMA(&hspi3, (uint8_t *)&txAck, (uint8_t *)&rxAck, 1) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
}while(rxAck != SPI_SLAVE_SYNBYTE);
}
void Receive_Spi_Master(void)
{
if(HAL_SPI_Receive_DMA(&hspi3, rxSpi, 10) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
}
void Transmit_Spi_Master(void)
{
if(HAL_SPI_Transmit_DMA(&hspi3, txSpi, 10) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
flagSpi1 = true;
}
}
main(void)
{
Init_Part();
while(1)
{
if(flagSpi1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
Synch();
Receive_Spi_Master();
Synch();
Transmit_Spi_Master();
Synch();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
Send_Data_To_Terminal_Via_Uart(rxSpi);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);
flagSpi1 = false;
}
}
}
奴隶代码:
#define SPI_SLAVE_SYNBYTE (0xAC)
#define SPI_MASTER_SYNBYTE (0x53)
uint8_t txSpi[10] = "Test";
uint8_t rxSpi[10];
void Synch(void)
{
uint8_t txAck = SPI_SLAVE_SYNBYTE;
uint8_t rxAck = 0;
do
{
if(HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&txAck, (uint8_t *)&rxAck, 1) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
}while(rxAck != SPI_MASTER_SYNBYTE);
}
void Transmit_Spi_Slave(void)
{
if(HAL_SPI_Transmit_DMA(&hspi1, txSpi, 10) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
}
void Receive_Spi_Slave(void)
{
if(HAL_SPI_Receive_DMA(&hspi1, rxSpi, 10) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
}
main(void)
{
Init_Part();
while (1)
{
if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))
{
Synch();
Transmit_Spi_Slave();
Synch();
Receive_Spi_Slave();
Synch();
HAL_Delay(3);
}
}
}
解决方案
空闲时,味噌没关系,什么都不应该读它。忽略那个。
当你得到垃圾时,你的屏幕是什么样的?您的所有引脚都配置为高速吗?两个设备可以高速通信吗?您能否向我们展示一些基本配置为低速的东西,然后是相同的高速输出?
推荐阅读
- spring-batch - Spring Batch 使用 CompositeItemWriter 和 CompositeItemProcessor
- c - 有人可以解释这段代码如何在不使用 strtok 的情况下拆分字符串吗?
- c# - 无法以 UTF-8 编码保存带有 BOM 的文本文件
- javascript - 变异对象与浅克隆的性能
- android - Issue with Firebase Realtime Database query
- c# - 如何公开 IP 地址,以便设备可以连接并使用连接到 IP 的计算机作为 websocket 服务器
- r - 使用legend.position =“bottom”时如何获得每个比例/ aes /指南的一行
- go - 如何 100% 确定 goroutine 是按条件等待的?
- c# - C# TCP连接,客户端无法向服务器发送消息
- javascript - Javascript - 在日期和时间格式之间添加逗号