打印

STM32 SPI中断接收数据问题

[复制链接]
14716|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiao20041128|  楼主 | 2012-8-20 17:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用SPI直接扫描方式和中断收发的方式与AD芯片连接时,SPI直接扫描数据正确,而采用SPI中断接收的数据要小一半,是什么原因?比如直接SPI的值是64000,而中断SPI的值是32000
AD使用的是ADS8230,16位数据取3次SPI数据的第7到22位

中断接收的代码:
void SPI1_IRQHandler(void)
{
        static u8         spibuf[4];
        static u8        spicount=0;
        u32 spibuffer;       
                                                                         
        if( SPI_I2S_GetITStatus( SPI1, SPI_I2S_IT_RXNE ) == SET )          //接收中断
        {                                                          
                spibuf[spicount] = SPI_I2S_ReceiveData(SPI1);
                spicount++;
                if( spicount >= 3 )
                {
                        CS_ADS_H;
                        spicount = 0;
                        spibuffer = (spibuf[0]<<6);
                        spibuffer = (spibuffer<<2)|spibuf[1];
                          spibuffer = (spibuffer<<6)|(spibuf[2]>>2);       

                        Adc16bit = spibuffer;
                }
        }       
        else        //发送空中断
        {
                if( spicount == 0 )
                        CS_ADS_L;
                SPI_I2S_SendData(SPI1,0);
        }
}

直接SPI扫描的代码:
unsigned int Read_ads( void )
{                       
        u8 spibuf[4];
        u32 spibuffer;

        CS_ADS_L;
        spibuf[0] = SPI_WriteByte( 0 );
        spibuf[1] = SPI_WriteByte( 0 );
        spibuf[2] = SPI_WriteByte( 0 );
           CS_ADS_H;

        spibuffer = spibuf[0]<<6;
        spibuffer = (spibuffer<<2) | spibuf[1];
          spibuffer = (spibuffer<<6) | spibuf[2]>>2;

        return (u16)spibuffer;       
}

unsigned char SPI_WriteByte(unsigned char data)
{
        unsigned char Data = 0;
       
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);  //等待发送缓冲区空  
        SPI_I2S_SendData(SPI1,data);                                                                // 发送一个字节
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET); //等待是否接收到一个字节
        Data = SPI_I2S_ReceiveData(SPI1);                                                            // 获得该字节
       
        return Data;                                                                                                   // 返回收到的字节
}  

各位大虾帮忙看下到底是什么情况?

相关帖子

沙发
airwill| | 2012-8-20 20:44 | 只看该作者
呵呵, 找自己的调速器帮忙吧, 让人家没有硬件的条件下来猜你的问题, 不太辛苦了吗?

使用特权

评论回复
板凳
xiao20041128|  楼主 | 2012-8-25 10:22 | 只看该作者
发现原因了!
软件问题,SPI同时开发送接收导致中断太频繁,丢中断!!!!!!!!!

使用特权

评论回复
地板
zijia0328| | 2014-8-15 17:03 | 只看该作者
xiao20041128 发表于 2012-8-25 10:22
发现原因了!
软件问题,SPI同时开发送接收导致中断太频繁,丢中断!!!!!!!!! ...

撸主,请问如果STM32做从设备,AD芯片做主设备给怎么改程序呢,我的AD7765芯片是主动发出10M时钟信号的,而且还发出数据有效控制信号FSO低电平有效,其有效时间是32个时钟周期,我把它接到NSS上了,选硬件置位。AD对STM接线如下:SDO-MOSI,SDI-MISO,FSO-NSS,SCO-SCK。我下载了程序,但是SPI的接收状态位一直没变,说明就移位寄存器就没接到数据,怎么解决呢?

使用特权

评论回复
5
peiwen| | 2015-5-20 09:41 | 只看该作者
zijia0328 发表于 2014-8-15 17:03
撸主,请问如果STM32做从设备,AD芯片做主设备给怎么改程序呢,我的AD7765芯片是主动发出10M时钟信号的, ...

请问,这个问题你最终如何解决了呢?

使用特权

评论回复
6
1044132648| | 2017-11-30 14:26 | 只看该作者
请问一下spi发送的时候为什么要等待接受

使用特权

评论回复
7
feelhyq| | 2017-12-1 10:18 | 只看该作者
1044132648 发表于 2017-11-30 14:26
请问一下spi发送的时候为什么要等待接受

因为SPI是全双工通信

使用特权

评论回复
8
1044132648| | 2017-12-1 18:02 | 只看该作者
feelhyq 发表于 2017-12-1 10:18
因为SPI是全双工通信

那如果从机开启接受中断,当主机发送启动时钟给我的时候,我是否也会进入中断,按这个写法此时从机接受到的数据是没有用的,亦或者我自己每次发数据给主机,我自己也会回收到数据进入中断吗

使用特权

评论回复
9
liang1993| | 2017-12-1 18:42 | 只看该作者
这么神奇的问题。终端里面尽量不要阻塞吧,否则主程序得不到执行

使用特权

评论回复
10
1576324301| | 2018-8-13 08:14 | 只看该作者
1044132648 发表于 2017-12-1 18:02
那如果从机开启接受中断,当主机发送启动时钟给我的时候,我是否也会进入中断,按这个写法此时从机接受到 ...

怎么解决的,我遇到的问题和你一样,你解决了吗

使用特权

评论回复
11
xiao20041128|  楼主 | 2018-10-7 22:26 | 只看该作者
最后解决了,SPI时序编程不对,所以读取的都是错位的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

69

帖子

0

粉丝