OpenEdv-开源电子网

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

STM32SPI双机通信数据有误

[复制链接]

3

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-8-31
在线时间
5 小时
发表于 2019-3-22 16:29:14 | 显示全部楼层 |阅读模式
5金钱
请问一下,我做的是2个STM32  SPI双机通信 主机是STM32F103VET6 SPI2,从机是STM32F103rct6   SPi1

接线是这么接的

主机主函数

从机主函数

就是主机发送一个固定的数值到从机上,然后再用串口小板打印到PC端,但是发现数据有时候对,有时候不对,
从机按下复位后

发现接收到的数据会变化,主机按下复位后接受到的数据都变成了0,请问下这是怎么回事呢,我就是想用SPI双机通信传一个固定的数值。

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

使用道具 举报

3

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-8-31
在线时间
5 小时
 楼主| 发表于 2019-3-22 16:33:56 | 显示全部楼层
主机SPI配置  

void SPI2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_SetBits(GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

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

        SPI_Cmd(SPI2, ENABLE); //ê1ÄüSPIíaéè
       
        SPI2_ReadWriteByte(0xff);//Æô¶ˉ′«êä                 
}  

从机SPI配置
void SPI1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  //NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        //GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
//éèÖ&#195A43éÎa′ó»úSPIí¨DÅμÄÆ¬Ñ¡1ü½Å£¬ÎòÃÇÔú3õê¼×îoó¸øËû±ä3é0¾í¿éòÔáË£¬ÕaÑù±íê¾Ñ¡ÖDÎa′ó»ú
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
       
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //éèÖÃSPIμ¥Ïò»òÕßË«ÏòμÄêy¾YÄ£ê½:SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                //éèÖÃ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ê±ÖóμÄÎèì¬:ê±ÖóDü¿Õ¸ß
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //êy¾Y2¶»ñóúμú¶t¸öê±ÖóÑØ
        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(SPI1, &SPI_InitStructure);  //¸ù¾YSPI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèSPIx¼Ä′æÆ÷

        SPI_Cmd(SPI1, ENABLE); //ê1ÄüSPIíaéè
       
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);  //à-μíPA4
  //SPI1_ReadWriteByte(0xff);//Æô¶ˉ′«êä                 
}   


都是移植的MINi板的代码,就SPI_InitStructure.SPI_Mode  就这一位不一样
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 00:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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