OpenEdv-开源电子网

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

spi双机通信问题

[复制链接]

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
发表于 2015-12-18 15:53:57 | 显示全部楼层 |阅读模式
5金钱

/配置spi函数/
void SPI_NRF_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
 
 /*使能GPIOB,GPIOD,复用功能时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);

 /*使能SPI1时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  /*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能
  GPIO_Init(GPIOA, &GPIO_InitStructure); 

  /*配置SPI_NRF_SPI的CE引脚,GPIOA^2和SPI_NRF_SPI的 CSN 引脚: NSS GPIOA^1*/
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

   /*配置SPI_NRF_SPI的IRQ引脚,GPIOA^3*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  /* 这是自定义的宏,用于拉高csn引脚,NRF进入空闲状态 */
  NRF_CSN_HIGH();
 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;       //主模式
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;      //数据大小8位
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;       //时钟极性,空闲时为低
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;          //NSS信号由软件产生
  SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256 ;  //8分频,9MHz
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;      //高位在前
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);
}
/发送和接收函数/

u8 SPI_NRF_RW(u8 dat)
{   
   /* 当 SPI发送缓冲器非空时等待 */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 
   /* 通过 SPI2发送一字节数据 */
  SPI_I2S_SendData(SPI1, dat);  
 
   /* 当SPI接收缓冲器为空时等待 */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  /* Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(SPI1);
}

/主函数/
int main(void)
{
   SPI_NRF_Init();
 USART1_Config();

 

 while(1)
    {


   i=SPI_NRF_RW(0x01) ;
      Delay(0xffff);
   i=SPI_NRF_RW(0x02) ;
   Delay(0xffff);
   i=SPI_NRF_RW(0x03) ;
   Delay(0xffff);
   i=SPI_NRF_RW(0x04) ;
   Delay(0xffff);
   i=SPI_NRF_RW(0x05) ;
   Delay(0xffff);

 }

不知道为什么主函数后面的延时特别重要,如果延时短了的话,发送的数据顺序就不对啦,可能某一个数据会发送多次,或者是乱码。主设备的程序,和从设备的程序基本一致,一个发送,一个一直接收。求大神赐教。

最佳答案

查看完整内容[请看2#楼]

回复【6楼】fangzhe1992: --------------------------------- 程序都是大同小异的,你的程序可以跑,就代表没错啦,后面跑乱了,问题就是你的延时,要看你和什么东西通讯,分析那个东西的时序图,再调整你的延时,SPI是串行通讯,时序很重要,希望可以帮到你
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-10-25
在线时间
3 小时
发表于 2015-12-18 15:53:58 | 显示全部楼层
回复【6楼】fangzhe1992:
---------------------------------
程序都是大同小异的,你的程序可以跑,就代表没错啦,后面跑乱了,问题就是你的延时,要看你和什么东西通讯,分析那个东西的时序图,再调整你的延时,SPI是串行通讯,时序很重要,希望可以帮到你
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-19 13:42:44 | 显示全部楼层
帮顶....
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2015-12-22 15:30:04 | 显示全部楼层
谢谢原子哥百忙之中抽出时间来回复我
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-10-25
在线时间
3 小时
发表于 2015-12-23 20:14:14 | 显示全部楼层
时序问题很重要,延时不精确,导致后面的数据会出现乱码,我也遇过类似的问题
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2015-12-24 17:27:19 | 显示全部楼层
回复【4楼】283804313:
---------------------------------
大神,求赐教。至今未解决。延时不精准是什么意思?我现在的程序是一开始数据是正确的,跑着跑着就是乱码啦。
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2015-12-24 17:29:32 | 显示全部楼层
回复【4楼】283804313:
---------------------------------
或者给小弟一个参考例程也是可以的。我的邮箱是2278985524@qq.com。感激不已。
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2016-2-17 17:00:45 | 显示全部楼层
谢谢楼主。
回复

使用道具 举报

5

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2015-9-11
在线时间
46 小时
发表于 2016-3-27 20:48:13 | 显示全部楼层
帮顶,我也遇到这样问题,两个板子,spi通信,传输的和接收的数据只有有时候部分相同.
迫于生计
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2016-4-12 17:04:13 | 显示全部楼层
aa511950071 发表于 2016-3-27 20:48
帮顶,我也遇到这样问题,两个板子,spi通信,传输的和接收的数据只有有时候部分相同.

解决了吗
回复

使用道具 举报

5

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2015-9-11
在线时间
46 小时
发表于 2016-4-12 18:30:20 | 显示全部楼层

你两块板子共地了吗?后期改成中断接收的代码了。可以实现通信,现在问题是spi dma 写w25q128失败,总是停在写,dma传输事件标志位不干活。。。。就是说数据传输不了。
迫于生计
回复

使用道具 举报

5

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2015-9-11
在线时间
46 小时
发表于 2016-4-12 18:34:13 | 显示全部楼层
我把代码发给你!你自己看看吧。我这个是实现两块板子的通信,一块战舰V3,一块战舰V2。

SPI中断全双工传输.rar

5.88 MB, 下载次数: 185

迫于生计
回复

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-4-12 18:34:51 | 显示全部楼层
也要用到SPI了,表示关注一下
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
 楼主| 发表于 2016-4-20 10:57:03 | 显示全部楼层
aa511950071 发表于 2016-4-12 18:34
我把代码发给你!你自己看看吧。我这个是实现两块板子的通信,一块战舰V3,一块战舰V2。

谢啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 09:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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