OpenEdv-开源电子网

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

SPI主从机通信问题(昨天发错了帖子,重新发一下)

[复制链接]

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-4 08:14:47 | 显示全部楼层 |阅读模式
1金钱
我设置好主从机后,分别下载两个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                  
}[/mw_shl_code]
[mw_shl_code=applescript,true]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劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-5 01:42:28 | 显示全部楼层
论坛 有网友发过主从代码,你可以参考下。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-4-19
在线时间
3 小时
发表于 2018-5-7 09:50:35 | 显示全部楼层
一、如果你在spi初始化时配置了中断,那么在通讯中就会进入中断。
二、我在在主从机通讯中如果用中断发送和接收不会出错,如果在主函数接收和发送就会引起数据错位。
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2018-5-7 14:43:55 | 显示全部楼层
szl961005 发表于 2018-5-7 09:50
一、如果你在spi初始化时配置了中断,那么在通讯中就会进入中断。
二、我在在主从机通讯中如果用中断发送 ...

我设置了SPI接收中断,不是应该和USART一样吗,只有接收到数据了,才会进入中断,为什么没有接收数据也会产生中断?我试了,即使我MOSI什么也 不接,主机发送完数据后,也会进入接收中断
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-7 15:02:50 | 显示全部楼层
wangmingwei093 发表于 2018-5-7 14:43
我设置了SPI接收中断,不是应该和USART一样吗,只有接收到数据了,才会进入中断,为什么没有接收数据也会 ...

哥,SPI是发送的同时也接收的啊
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
 楼主| 发表于 2018-5-7 15:04:44 | 显示全部楼层
szczyb1314 发表于 2018-5-7 15:02
哥,SPI是发送的同时也接收的啊

可是没收到数据也会进入中断吗?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-7 15:11:47 | 显示全部楼层
wangmingwei093 发表于 2018-5-7 15:04
可是没收到数据也会进入中断吗?

SPI发送的同时会接收,你主机怎么接收的,是receive = SPI_SEND(0XFF);发送一个假的数据提供时钟,
你只关注发送SPI_SEND(send);同时会接收到一个假的数据

你去看看SPI的工作原理
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-4-19
在线时间
3 小时
发表于 2018-5-9 09:56:14 | 显示全部楼层
wangmingwei093 发表于 2018-5-7 14:43
我设置了SPI接收中断,不是应该和USART一样吗,只有接收到数据了,才会进入中断,为什么没有接收数据也会 ...

你只要设置了中断,无论是主从机,在发送和接收时就是进入中断-即时你只接了主从的mosi脚。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 05:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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