Other Parts Discussed in Thread: CC2530
我在做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;
}
请大家看看,我是哪里没有写好?我该从哪里改进以便能获得接近于理想的时间消耗?