主机:
int main(void)
{
RCC_Configuration(); /* 设置系统时钟 */
GPIO_Configuration(); /* 设置 GPIO 端口 */
SPI_Configuration(); /* 设置 SPI */
USART_Configuration(); /* 设置 USART */
while(Tx_Idx < BufferSize)
{
SPI1_Buffer_Rx[Rx_Idx++] = SPI_WriteByte(SPI1,SPI1_Buffer_Tx[Tx_Idx++]);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("\r\nThe SPI1 has sended data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI1_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("\r\nThe SPI1 has receive data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI1_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
}
void SPI_Configuration(void)
{
/*
* SPI 设置为双线双向全双工
* SPI 发送接收 8 位帧结构
* 时钟悬空低
* 数据捕获于第二个时钟沿
* 内部 NSS 信号由 SSI 位控制
* 波特率预分频值为 4
* 数据传输从 LSB 位开始
* 用于 CRC 值计算的多项式
*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* 设置 SPI1 为主机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &SPI_InitStructure);
/* 使能 SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
从机:
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
SPI_Configuration();
USART_Configuration();
printf("\r\n START: \r\n");
while(1)
{
while(Rx_Idx < BufferSize)
{
SPI2_Buffer_Rx[Rx_Idx++] =SPI_WriteByte(SPI2,SPI2_Buffer_Tx[Tx_Idx++]);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("\r\nThe SPI2 has receive data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI2_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("\r\nThe SPI2 has sended data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI2_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
}
}
void SPI_Configuration(void)
{
/*
* SPI 设置为双线双向全双工
* SPI 发送接收 8 位帧结构
* 时钟悬空低
* 数据捕获于第二个时钟沿
* 内部 NSS 信号由 SSI 位控制
* 波特率预分频值为 4
* 数据传输从 LSB 位开始
* 用于 CRC 值计算的多项式
*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* 设置 SPI2 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE); /* 使能 SPI2 */
}
STM32_1用SPI1设为主机,STM32_2用SPI2设为从机模式,用串口查看接收数据
这是SPI发送接收函数:
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
{
while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待发送区空
SPIx->DR=Byte; //发送一个byte
while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完一个byte
return SPIx->DR; //返回收到的数据
}
问题:
为什么我的从机收到的总是错误数字 ?麻烦大家了,真心希望指点! |