OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10499|回复: 7

两个STM32之间的SPI 通信问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2012-5-2
在线时间
0 小时
发表于 2013-3-19 16:39:55 | 显示全部楼层 |阅读模式
主机:
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;                //返回收到的数据   
}
问题:
为什么我的从机收到的总是错误数字 ?麻烦大家了,很急,真心希望指点,我整了好久....

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2013-3-19 17:28:34 | 显示全部楼层
主从通信的话,你要遵循这样的:
1 主机和从从机配置的时候,初始化部分是相同的,不要修改,
 只要SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; 这里不同就OK
2 主机在发送数据的时候,用主循环去发,
  从机就用DMA去接,用中断去发送
3 保持主从机的片选信号,一直为低
 4 如果双机间通信的时候带有通信协议的话,主机读写就这样
 SPI1_Buffer_Rx[Rx_Idx++] =   SPI_WriteByte(SPI1,SPI1_Buffer_Tx[Tx_Idx++]);
 在接收完毕之后则对缓冲区的数据进行分析,建立环形缓冲区去发送消息
也可以主机没过一定的时间去接受从机发送过来的数据,不过这样的话,要对时间掐算的好,
回复 支持 反对

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2013-3-19 17:35:50 | 显示全部楼层
而且在做测试程序的时候,主机要写一个死循环一直发送或者接收消息,然后用从机去慢慢调试,这样,找问题也快,,
回复 支持 反对

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
发表于 2013-3-19 19:24:13 | 显示全部楼层
详细说说都怎么个错误,是收到所有数据都是错误的,还是有正确的有错误的,
回复 支持 反对

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
发表于 2014-8-7 11:50:34 | 显示全部楼层
lz问题解决了没有!!我也有同样的问题呀!!!能给个联系的方式吗?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-8-6
在线时间
8 小时
发表于 2015-8-9 14:47:20 | 显示全部楼层
楼主,代码文件求分享,谢谢!!
回复 支持 反对

使用道具 举报

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2014-11-9
在线时间
5 小时
发表于 2015-11-8 19:42:51 | 显示全部楼层
我用中断接收,然后同时按下复位就可以了
加油,奋斗
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2016-8-1
在线时间
5 小时
发表于 2016-8-1 15:11:49 | 显示全部楼层
楼主,求程序!!!谢谢你
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表