当前位置: 代码迷 >> 单片机 >> 请问两个STM32之间进行SPI通讯出现的有关问题
  详细解决方案

请问两个STM32之间进行SPI通讯出现的有关问题

热度:113   发布时间:2016-04-28 15:09:51.0
请教两个STM32之间进行SPI通讯出现的问题
主机:
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;                //返回收到的数据   
}
问题:
为什么我的从机收到的总是错误数字 ?麻烦大家了,很急,真心希望指点,我整了好久....