OpenEdv-开源电子网

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

两个STM32F4的板子,用SPI通信,主机发送正常,接收乱码!!!求救

[复制链接]

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
发表于 2017-2-13 17:47:55 | 显示全部楼层 |阅读模式
10金钱
主机给从机发送正常,从机回复主机乱码,全是FF。在从机一端仿真发现接收数据正常,说明从机接收没有问题。1、是不是双机通信的时候只能主机给从机发送数据,从机不能主动发送?我想做的不是全双工通信,是主机发送完成从机解析后主动回复的

2、我试过在发送数据前修改SPI的主从模式,这样的话直接发送的就是乱码
3、还有人说用SPI的TI MODE模式比较好一点,可是我不会用这个
请大牛指点迷津。。。谢谢!!!

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

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2013-7-29
在线时间
278 小时
发表于 2017-2-14 08:08:38 | 显示全部楼层
你在论坛里找下我的帖子,我在前年写过这方面的。
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2013-7-29
在线时间
278 小时
发表于 2017-2-14 08:09:56 | 显示全部楼层
SPI通信你要注意波特率、相位、极性的设置,一般把CS脚自己控制,不采用TI模式。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-14 10:14:39 | 显示全部楼层
xuyan021 发表于 2017-2-14 08:08
你在论坛里找下我的帖子,我在前年写过这方面的。

你好,我刚看了你的帖子。
http://www.openedv.com/forum.php?mod=viewthread&tid=63358 是这个吧,这个说的只是主机发送从机接收的。
我现在问题是1是主机2是从机,1给2发送正常,发送完成1变从机2变主机,2给1发送数据乱码,在变换1,2主从模式的时候需要怎么设置
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-14 10:15:44 | 显示全部楼层
xuyan021 发表于 2017-2-14 08:08
你在论坛里找下我的帖子,我在前年写过这方面的。

这是1的初始化,配置为主机
GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;//NVIC??????
       
        //ÕaàïÖ»Õë¶ÔSPI¿ú3õê¼»ˉ
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//¸′λSPI2
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//í£Ö1¸′λSPI2
        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA1, ENABLE);
  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA1, DISABLE);

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ê1ÄüGPIOBê±Öó
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//ê1ÄüSPI2ê±Öó

  //GPIOB13,14,153õê¼»ˉéèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//PB12~15¸′óÃ1|Äüêä3ö       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éÏà-
  GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉ
       
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13¸′óÃÎa SPI2
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); //PB14¸′óÃÎa SPI2
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15¸′óÃÎa SPI2

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //éèÖÃSPIμ¥Ïò»òÕßË«ÏòμÄêy¾YÄ£ê½:SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //éèÖÃSPI1¤×÷Ä£ê½:éèÖÃÎaÖ÷SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //éèÖÃSPIμÄêy¾Y′óD¡:SPI·¢Ëí½óêÕ8λ֡½á11
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //′®DDí¬2½ê±ÖóμÄ¿ÕÏD×′ì¬Îa¸ßμçÆ½
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //′®DDí¬2½ê±ÖóμÄμú¶t¸öìø±äÑØ£¨éÏéy»òϽ죩êy¾Y±»2éÑù
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSSDÅoÅóéó2¼t£¨NSS1ü½Å£©»1êÇèí¼t£¨ê1óÃSSI룩1üàí:Äú2¿NSSDÅoÅóDSSIλ¿ØÖÆ
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //¶¨òå2¨ìØÂêÔ¤·ÖÆμμÄÖμ:2¨ìØÂêÔ¤·ÖÆμÖμÎa256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //Ö¸¶¨êy¾Y′«êä′óMSBλ»1êÇLSBλ¿aê¼:êy¾Y′«êä′óMSBλ¿aê¼
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRCÖμ¼ÆËãμĶàÏîê½
        SPI_Init(SPI2, &SPI_InitStructure);  //¸ù¾YSPI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèSPIx¼Ä′æÆ÷

        SPI_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); //¿aÖD¶Ï
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);//SPI_I2S_DMAReq_Rx|
        SPI_Cmd(SPI2, ENABLE); //ê1ÄüSPIíaéè
        //DMA TX
        DMA_DeInit(DMA1_Stream4);
        while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//μè′yDMA¿éÅäÖÃ
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&TFT_Send;//(uint32_t)(&AD7606SpiTransferData);
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = 0;//SpiTransferDataNummber;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//high
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′æ′¢Æ÷í»·¢μ¥′Î′«êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí»·¢μ¥′Î′«êä
        DMA_Init(DMA1_Stream4, &DMA_InitStructure);
        DMA_ITConfig(DMA1_Stream4, DMA_IT_TC, ENABLE);//ê1ÄüÖD¶Ï
        DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
  DMA_Cmd(DMA1_Stream4, ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  =   2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority         =   0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-14 10:16:48 | 显示全部楼层
xuyan021 发表于 2017-2-14 08:08
你在论坛里找下我的帖子,我在前年写过这方面的。

发送完可以直接这样设置为从机么???
SPI_InitTypeDef  SPI_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//ê1ÄüSPI2ê±Öó
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
        SPI_Init(SPI2, &SPI_InitStructure);
回复

使用道具 举报

28

主题

288

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1213
金钱
1213
注册时间
2011-4-9
在线时间
97 小时
发表于 2017-2-14 13:49:36 | 显示全部楼层
两块板子之间为啥不用串口,SPI是板上总线。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-14 14:16:37 | 显示全部楼层
山峰雪狼 发表于 2017-2-14 13:49
两块板子之间为啥不用串口,SPI是板上总线。

串口通信速率慢,屏幕要求刷新速率快。SPI速度快呀
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-14 14:17:26 | 显示全部楼层
山峰雪狼 发表于 2017-2-14 13:49
两块板子之间为啥不用串口,SPI是板上总线。

64K的数据传输,串口有点慢了。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-18 15:56:03 | 显示全部楼层
还是没有人吗?快疯了
回复

使用道具 举报

10

主题

28

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-19
在线时间
14 小时
发表于 2017-2-22 14:27:38 | 显示全部楼层
帮楼主顶顶,最近也在搞这个SPI通信
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2017-2-23 10:21:38 | 显示全部楼层
袁小远 发表于 2017-2-22 14:27
帮楼主顶顶,最近也在搞这个SPI通信

朋友,你的双机spi主从切换有问题没?
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-9-22 18:48:55 | 显示全部楼层
caii
啊 啊啊啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 16:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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