单片机/MCU论坛
直播中

申换换

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

ADUC7060中SPITX与SPIRX是否在物理上共用一个寄存器?

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

我之前用过的PIC单片机,其SPI结构如图所示,但我并没在ADUC7060的数据手册上找到其SPI的图片。所以有如下问题:
PIC单片机中,SPI中发送与接收共用一个寄存器SSPBUF,ADUC7060中SPITX与SPIRX也是否在物理上也是共用一个寄存器?
(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]读取?
(3)SPI发送接收4个字节产生中断的问题
如果设SPICON中SPIMDE为11,也即发送或接收完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个数据?
(5)ADUC7060中,如果使用外部晶振,定时器1就要作为唤醒定时器。当器件被唤醒后,定时器1是否还能做别的用途?
非常感谢!

回帖(1)

张辉

2024-1-12 10:59:05
对于ADUC7060,SPITX和SPIRX并不共用一个寄存器。ADUC7060具有两个SPI接口,分别为SPI0和SPI1。每个SPI接口都有一个独立的发送寄存器(SPITX)和接收寄存器(SPIRX)。

对于使用SPI接收数据的问题,你需要先发送相应的控制字节(如果有的话),然后通过读取SPI接收寄存器(SPIRX)来获取接收到的数据。发送控制字节的目的是为了产生时钟信号来驱动数据的传输。

需要注意的是,SPI接口是一种同步的串行通信协议,发送和接收的时钟信号必须同步,所以在接收数据之前需要先发送数据。并不是发送的数据会直接接收回来,而是需要通过时钟信号来进行数据的传输。

希望这可以解答你的问题,如果还有其他问题,请随时提问。
举报

更多回帖

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