首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2013-12-15 
请教两个STM32之间进行SPI通讯出现的问题主机:int main(void){RCC_Configuration()/* 设置系统时钟 */GPI

请教两个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;                //返回收到的数据   
}
问题:
为什么我的从机收到的总是错误数字 ?麻烦大家了,很急,真心希望指点,我整了好久....


[解决办法]
挺难弄的!!!
[解决办法]
是我看错了还是怎么的,你主从机调用的都是写函数啊,应该一发一收的嘛
SPI1_Buffer_Rx[Rx_Idx++] =SPI_WriteByte(SPI1,SPI1_Buffer_Tx[Tx_Idx++]);  
SPI2_Buffer_Rx[Rx_Idx++] =SPI_WriteByte(SPI2,SPI2_Buffer_Tx[Tx_Idx++]);
还有,显示也不对啊,%0.2d 是什么格式?

热点排行