OpenEdv-开源电子网

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

双STM32之间的SPI通信问题

[复制链接]

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-3 16:55:45 | 显示全部楼层 |阅读模式
我设置好主从机后,分别下载两个STM32板子上,然后从机收到数据后,从串口上打印出来,以下是遇到的问题:
1、主机发送数据,但是自身会进入SPI接收中断中,不解。
2、主机向从机发送数据,从机有时候会出现乱码或者丢失数据。
3、重启主机后,会导致从机接收乱码。
根据以上的问题,我查看了吧里的帖子,第一个问题没找到第2个问题如果设置一个流控或者什么的会不会可以解决?第3个问题我感觉应该都跟SCK有关系,但是不知道怎么解决。
请原子哥或者吧里的吧友们给点参考意见,万分感谢
贴出部分代码:
主机:
[mw_shl_code=applescript,true]void SPI1_Init(void)
{         
        RCC->APB2ENR|=1<<2;       //PORTAê±&#214;óê1&#196;ü          
        RCC->APB2ENR|=1<<12;      //SPI1ê±&#214;óê1&#196;ü
                  
        //&#213;aà&#239;&#214;&#187;&#213;&#235;&#182;&#212;SPI&#191;ú3&#245;ê&#188;&#187;ˉ
        GPIOA->CRL&=0X000FFFFF;
        GPIOA->CRL|=0XBBB00000;//PA5.6.7&#184;′ó&#195;          ×&#238;′ó&#203;ù&#182;è50MHZê&#228;3&#246;&#184;′ó&#195;&#199;&#191;í&#198;íì   
        GPIOA->ODR|=0X7<<5;    //PA5.6.7é&#207;à-
               
        SPI1->CR1|=0<<10;//è&#171;&#203;&#171;1¤&#196;£ê&#189;       
        SPI1->CR1|=1<<9; //èí&#188;tnss1üàí
        SPI1->CR1|=0<<8; //Clear ZERO?????

        SPI1->CR1|=0<<2; //SPI Slave&#187;ú
        SPI1->CR1|=0<<11;//8bitêy&#190;Y&#184;&#241;ê&#189;        Set 1??????
        SPI1->CR1|=1<<1; //&#191;&#213;&#207;D&#196;£ê&#189;&#207;&#194;SCK&#206;a1 CPOL=1
        SPI1->CR1|=1<<0; //êy&#190;Y2é&#209;ù′óμú&#182;t&#184;&#246;ê±&#188;&#228;±&#223;&#209;&#216;&#191;aê&#188;,CPHA=1  
        SPI1->CR1|=7<<3; //Fsck=Fcpu/256
        SPI1->CR1|=0<<7; //MSBfirst  
        SPI1->CR2 |= 1<<6;
        MY_NVIC_Init(3,2,SPI1_IRQn,2);
        SPI1->CR1|=1<<6; //SPIéè±&#184;ê1&#196;ü
       
//        SPI1_ReadWriteByte(0xff);//&#198;&#244;&#182;ˉ′&#171;ê&#228;(&#214;÷òa×÷ó&#195;£o&#206;&#172;3&#214;MOSI&#206;a&#184;&#223;)                 
}  [/mw_shl_code]

从机:
[mw_shl_code=applescript,true]void SPI1_Init(void)
{         
        RCC->APB2ENR|=1<<2;       //PORTAê±&#214;óê1&#196;ü          
        RCC->APB2ENR|=1<<12;      //SPI1ê±&#214;óê1&#196;ü
                  
        //&#213;aà&#239;&#214;&#187;&#213;&#235;&#182;&#212;SPI&#191;ú3&#245;ê&#188;&#187;ˉ
        GPIOA->CRL&=0X000FFFFF;
        GPIOA->CRL|=0XBBB00000;//PA5.6.7&#184;′ó&#195;          ×&#238;′ó&#203;ù&#182;è50MHZê&#228;3&#246;&#184;′ó&#195;&#199;&#191;í&#198;íì   
        GPIOA->ODR|=0X7<<5;    //PA5.6.7é&#207;à-
               
        SPI1->CR1|=0<<10;//è&#171;&#203;&#171;1¤&#196;£ê&#189;       
        SPI1->CR1|=1<<9; //èí&#188;tnss1üàí
        SPI1->CR1|=1<<8;  

        SPI1->CR1|=1<<2; //SPI&#214;÷&#187;ú
        SPI1->CR1|=0<<11;//8bitêy&#190;Y&#184;&#241;ê&#189;        &#187;1ê&#199;16&#206;&#187;
        SPI1->CR1|=1<<1; //&#191;&#213;&#207;D&#196;£ê&#189;&#207;&#194;SCK&#206;a1 CPOL=1
        SPI1->CR1|=1<<0; //êy&#190;Y2é&#209;ù′óμú&#182;t&#184;&#246;ê±&#188;&#228;±&#223;&#209;&#216;&#191;aê&#188;,CPHA=1  
        SPI1->CR1|=7<<3; //Fsck=Fcpu/256
        SPI1->CR1|=0<<7; //MSBfirst  
        SPI1->CR2 |= 1<<6;
        MY_NVIC_Init(3,2,SPI1_IRQn,2);
        SPI1->CR1|=1<<6; //SPIéè±&#184;ê1&#196;ü
       
        //SPI1_ReadWriteByte(0xff);//&#198;&#244;&#182;ˉ′&#171;ê&#228;(&#214;÷òa×÷ó&#195;£o&#206;&#172;3&#214;MOSI&#206;a&#184;&#223;)                 
} [/mw_shl_code]
[mw_shl_code=applescript,true]void SPI1_SendByte(u8 TxData)
{               
        u16 retry=0;                                 
        while((SPI1->SR&1<<1)==0)//μè′y·¢&#203;í&#199;&#248;&#191;&#213;       
        {
                retry++;
                if(retry>0XFFFE) return;
        }                          
        SPI1->DR=TxData;                   //·¢&#203;íò&#187;&#184;&#246;byte                     
}

u8 SPI1_ReceiveByte(void)
{               
        u16 retry=0;                                 
        while((SPI1->SR&1<<0)==0) //μè′y&#189;óê&#213;íêò&#187;&#184;&#246;byte  
        {
                retry++;
                if(retry>0XFFFE)return 0;
        }                                                              
        return SPI1->DR;          //·μ&#187;&#216;ê&#213;μ&#189;μ&#196;êy&#190;Y                                    
}

void SPI1_IRQHandler(void)
{
        uint8_t data,sta;
                if((SPI1->SR &(1<<0)) == 1)
                {
                        SPI_DATA[SPI_SIZE] = data;
                        SPI_SIZE++;
                        if(SPI_SIZE>SPI_LENGTH)
                        {
                                SPI_SIZE = 0;
                        }
                        USART1->DR = data;
                        while((USART1->SR &(1<<6)) == 0);
                }
}[/mw_shl_code]

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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