ADI 技术
直播中

张林锋

7年用户 257经验值
私信 关注
[问答]

ADUC7060的SPI接收问题

你好,我最近初次使用ADI公司的单片机ADUC7060,有几个问题已经困扰我一段时间了,希望贵公司的工程师能为我解答一下,不胜感激!
1SPI结构的问题

我之前用过的PIC单片机,其SPI结构如图所示,但我并没在ADUC7060的数据手册上找到其SPI的图片。所以有如下问题:
PIC单片机中,SPI中发送与接收共用一个寄存器SSPBUFADUC7060SPITXSPIRX是否也是否在物理上也是共用一个寄存器?
 
2)、SPI接收数据的问题
PIC单片机中,SPI在接收时要先发送一字节数据,产生8个时钟,将数据通过移位寄存器SSPSR读取进来(发送即接收,接收即发送)。其spi读取代码如下:
 
SSPBUF=data1;//先发送1字节数据,以产生8个时钟,将所读取数据依次移位进SSPSR
while(!SSPIF);//等待发送完成
SSPIF=0;//清除标志位
data2=SSPBUF;//读取数据
 
ADUC7060的官方代码中,在数据接收时,先会有一个ucDummyRd=SPIRX,然后在中断中会有szRxData[ucRxCount++]=SPIRX
我想知道ucDummyRd=SPIRX中读取到的是什么值。它读取到的是否是FIFO的当前值?它读取到的是否是一个没用的数据?其目的是否只是为了产生8个时钟脉冲,以达到移位的目的(类似于PIC中接收数据前先发送数据)?真正有效的数据是否出现在中断中的szRxData[ucRxCount++]=SPIRX,被szRxData[0]读取?
 
3SPI发送接收4个字节产生中断的问题
如果设SPICONSPIMDE11,也即发送或接收完4个字节才产生中断,那么作为SPI接收的前奏,是否应该有4次个ucDummyRd=SPIRX?为什么在官方SPI_Test->SPI_Master
中只有一次ucDummyRd=SPIRX,只读取一次,产生8个时钟脉冲能造成中断吗?
 
4)在官方程序示例ADuC706x_IARExamplesIARSPI_TestMaster中,接收6个字节,为什么接收中断中写的是     
if (ucRxCount < 7) // Have max 6 bytes been received?
这岂非是接收7个字节?
在官方程序示例ADuC706x_IARExamplesIARSPI_BasicSPI_Master中,接收6个字节,为什么接收中断中写的是      
if (ucRxCount <16) // Have max 6 bytes been received?
这样是否读取了16个数据?
 
5ADUC7060中,如果使用外部晶振,定时器1就要作为唤醒定时器。当器件被唤醒后,定时器1是否还能做别的用途?
 
非常感谢!

回帖(1)

蒋喜玲

2018-8-18 06:43:04
ADuC7060的SPI的TX和RX fifo 是独立的。
我没有跑过这个code,读了一下,我觉得这里ucDummyRd=SPIRX是和这个参考代码相联系的,因为在while前,发送了一个字节,我认为是抛弃接收到的这个字节。
code中if (ucRxCount <16) // Have max 6 bytes been received? 这句话应该是有问题的,16或许应该是6。
如果7060是master,那么发送一个数据,对应就会接收一个数据(slave要配置好)。因为Master提供通信的clock,slave收到clock就会发送数据。
如果发送4个字节产生中断,这个在RX的buffer中也应该有4个字节,是否有用取决于实际的应用情况。
问题5,我觉得是可以的,前提是代码的先后顺序和执行逻辑上确保没有问题就可以。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分