OpenEdv-开源电子网

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

关于STM32 SPI的通信问题 困扰小弟好几天了

[复制链接]

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
发表于 2018-11-26 10:13:33 | 显示全部楼层 |阅读模式
1金钱
这几天用STM32F103VET6作为主控采集ADS1278的AD数据,SPI通信AD的采样率为70.232KHz,主频18M 当我的32SPI速度为8分频的时候可以得到正确的数据,但是在读数据的时候耗时太长,导致每读一个就会漏掉一个。当我把SPI调成4分频的时候SPI得到的数据反而比8分频的时候更少了,这是什么原因???

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

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
 楼主| 发表于 2018-11-26 10:15:38 | 显示全部楼层
void  EXTI15_10_IRQHandler(void)  //拷贝数据 只有这里   接受的不对 或者  加的不对? 因为只有一分钟的问题 所以更倾向于拷贝数据
{

                if(EXTI_GetITStatus(EXTI_Line11) != RESET)//获取外部中断11号线的 中断状态
                {
                        //EXTI_ClearITPendingBit(EXTI_Line11) ;
                        if(ADCDNUM==0)
                        {
                                memcpy(&ADCTIME[0], GPSTIME, 10);//时间
                                memcpy(&ADCTIME[10], &GPSTIME[41], 8);//日期                               
                        }
                       
            for(num=0;num<3;num++)
                                {                                       
                                        r= SPI2_ReadWriteByte(0xff);
                                        ADCBUFFER[ADCDTEMPEND][ADCDNUM+num]=r;
                                }
                                ADCDNUM=ADCDNUM+3;
                        if(ADCDNUM>=300)
                        {
                                ADCDNUM=0;
                                ADCDTEMPEND++;//数据队列未
                                if(ADCDTEMPEND>99)//循环使用队列空间
                                        ADCDTEMPEND=0;
                               
                                ADCDTEMPLENGTH++;//数据长度加一
                                if(ADCDTEMPLENGTH>99)//循环使用队列空间 //第十个数据将满了
                                        {
                                                ADCDTEMPLENGTH=100;
                                                ADCDTEMPHEAD++;
                                                if(ADCDTEMPHEAD>99)//循环使用队列空间
                                                        ADCDTEMPHEAD=0;
                                        }
                                SENDFLAG=1;//数据处理数据显示
                                DISPFLAG=1;
                        }
                               
                        EXTI_ClearITPendingBit(EXTI_Line11) ;                                                //清中断标志位
               
                }
}
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-11-26 10:43:21 | 显示全部楼层
你得看看你的芯片最大读取速度是多大,超过了就会丢包
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
 楼主| 发表于 2018-11-26 10:44:15 | 显示全部楼层
douxiaolingyun 发表于 2018-11-26 10:43
你得看看你的芯片最大读取速度是多大,超过了就会丢包

最大读取速度就是18MHz 手册上的理论值
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-11-26 11:17:55 | 显示全部楼层
当我把SPI调成4分频的时候SPI得到的数据反而比8分频的时候更少了,这是什么原因???
本来就应该如此啊,
8分频丢包,4分频就会丢包更严重了,
可以改16分频或32分频试试。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
 楼主| 发表于 2018-11-26 11:35:38 | 显示全部楼层
warship 发表于 2018-11-26 11:17
当我把SPI调成4分频的时候SPI得到的数据反而比8分频的时候更少了,这是什么原因???
本来就应该如此啊, ...

8分频丢包是因为读取的时间太长 导致AD的下一个数据来之前这一个还没处理完
我改成4分频是因为想提高读取速度 让AD的下一个数据送来前就读完
回复

使用道具 举报

8

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-12-4
在线时间
86 小时
发表于 2018-11-28 23:17:18 来自手机 | 显示全部楼层
主机不提供时钟从机是不会随便发送数据的。。。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
 楼主| 发表于 2018-11-29 20:08:41 | 显示全部楼层
fEndman 发表于 2018-11-28 23:17
主机不提供时钟从机是不会随便发送数据的。。。

32是主机提供时钟了,32的时钟不是设置好速度就可以了么
回复

使用道具 举报

8

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-12-4
在线时间
86 小时
发表于 2018-11-29 22:30:59 | 显示全部楼层
无心123 发表于 2018-11-29 20:08
32是主机提供时钟了,32的时钟不是设置好速度就可以了么

我的意思就是32的sck不产生上升/下降沿从机是不可能会在miso线上有任何信息输出的。。你这样丢字节明显是spi太快了从机跟不上才导致从机错过了时钟信号没有做出反应。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-4-5
在线时间
37 小时
 楼主| 发表于 2018-12-6 09:42:47 | 显示全部楼层
fEndman 发表于 2018-11-29 22:30
我的意思就是32的sck不产生上升/下降沿从机是不可能会在miso线上有任何信息输出的。。你这样丢字节明显是 ...

但是 我的这款AD是70K的采样率 大概在14us就会有一次数据输出,我的程序测试在8分频的SPI情况下读取时间需要在16US左右,所以中间漏了一次采样,我把SPI速度降下来会漏的更多,升上去反而还不如8分频
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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