我正在尝试在2个stm32设备之间进行基本的SPI通信。 HAL用于此目的。想法是每1秒在2个MCU之间交换数据。因此,我创建了一个定时器,其目的是每1秒产生一次中断(定时器用于设置开始SPI通信的标志)。 MCU配置为以全双工模式工作(1个主设备和1个从设备)。
我的问题是下一个问题:当将SPI配置为在较低带宽上工作时(预分频器为256或128),2个MCU按预期进行通信。随着速度的提高,在MOSI线上收集越来越多的垃圾。基本上,MISO线路无法按预期工作。 MISO线应保持低位时保持高位(看图片)。
主代码:
#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);
}
}
}
[处于空闲状态时,MISO无关紧要,没什么可读取的。不用管
[当您收到垃圾时,您的屏幕是什么样的?是否所有引脚都配置为高速?两个设备都可以高速通信吗?您能否向我们展示一些基本配置,例如低速运行,然后配置相同的高速输出?