微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > CC2530的SPI通信时间过长

CC2530的SPI通信时间过长

时间:10-02 整理:3721RD 点击:

    我在做CC2530的SPI通信时遇到一些问题,希望技术大拿们可以帮我看看!

    CC2530设置为master模式,系统时钟32M,spi波特率设置为最高4Mbps,按此波特率,读slave一个8位数据需要16个时钟,大概是4us,加上其他消耗,也不会太过偏离。

    实际测试时序图如附件所示,其中:

蓝色线为片选信号,黄色线为时钟信号,红色线为MOSI信号。可以看到,片选开始后,经过大约3us的时间,然后开始产生时钟信号,往外写地址,然后经过大约14us的时间,产生第二个时钟信号,读外部数据,读完后大约4us时间,片选拉高,一次读过程结束。

    我的疑问是,除时钟部分其他实际时间都消耗到哪里去了(3+14+4)?据我了解,32M时钟以及2530的加强的8051核,单指令周期也只有一个时钟周期即0.03125us,下面所写代码也不可能产生那么多的时间消耗。按照此种状况,读一次消耗的时间远远超过理论时间,严重不合理。

    下面,我贴出我的读写代码:

void SpiWriteByte(unsigned char data)
{
while(UxACTIVE);
UxDBUF = data;
while(UxTX_BYTE==0);
UxTX_BYTE = 0;
}

unsigned char SpiReadByte(unsigned char addr)
{
SpiWriteByte(addr);
unsigned char receive = UxDBUF;
return receive;
}

请大家看看,我是哪里没有写好?我该从哪里改进以便能获得接近于理想的时间消耗?

补充代码如下:

void Lis3dhWriteSfr(unsigned char addr, unsigned char data)
{
CS_ON;
SpiWriteByte(addr & 0x3F);
SpiWriteByte(data);
CS_OFF;
}

unsigned char Lis3dhReadSfr(unsigned char addr)
{
CS_ON;
SpiWriteByte((addr & 0xBF)|0x80);
unsigned char data = SpiReadByte(0xA5);
CS_OFF;
return data;
}

其中往外写对地址的处理大家可以不用管。

麻烦大家帮忙看看,谢谢!

整个过程是读了一个字节,还是分两次读了两个字节?请问你的两次数据读取之间有间隔吗?

直接调用了两次SpiReadByte吗?

这个程序是单独的裸跑程序,还是放在协议栈上面跑的

您好!

    图中片选时间内(即蓝色信号为低)是对设备做的一次读操作。设备是3d传感器lis3dh,它自身有好几个寄存器,于是2530与它通信的过程便是读写lis3dh的寄存器过程,都需要先指定要操作的lis3dh的寄存器的地址。

    我写的函数里面,是将每次读一个字节封装成一个函数,考虑到cc2530的读写buf都是UxBUF,即读操作其实也是要写入UxBUF来交换要读入的数据,所以,读函数也是直接调用写函数的,即SpiReadByte()实际也是直接调用SpiWriteByte()的。

   按照上面的描述,在一次读lis3dh寄存器中,片选一直有效,首先写设备寄存器地址,直接调用SpiWriteByte(),然后读寄存器的内容,调用的是SpiReadByte()。实际上是调用两次SpiWriteByte()函数的。

    两次操作时间没有任何延时的操作。

    程序是在裸板上跑的,并未使用协议栈。

    谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top