硬件部分确定后,就着手于软件调试了。秉持着先难后易的原则,首先就开始了AFE4490的SPI通信部分的调试。说到此,就不得不提一下R7F0C809的SPI部分,其CSI即串行阵列单元就是常见的SPI协议了,不过CSI与串口是共用一个通道的,即通道0,因此串口和SPI是不可同时使用的,但可以通过更改PIOR寄存器相应位将CSI/UART重映射到其他引脚。由于引脚资源比较有限,我只好利用OLED进行程序的调试了。因此,在进行CSI调试工作之前需要调教好OLED。具体过程可参考本人之前的一片帖子----------à
https://bbs.eeworld.com.cn/thread-472858-1-1.html。在此不再赘述。
重要的事情首先需要说说:瑞萨的CSI部分中SI、SO引脚并不是我们通常认为的MOSI和MISO,而是Serial Input、Serial Output的意思。基于此,在将R7F0C809作为主发送和接收时,SO=MOSI、SI=MISO。在确定好这一点后,就可以按照R7F0C809的DataSheet中CSI部分11.5.3章节去依次配置各个相关寄存器了。主控在单次模式下发送和接收流程图如下图所示:
具体配置过程可参考瑞萨官网给出的基于R7F0C807 CSI主发送和接收Demo----àan_r01an2495cc0100_r7f0c807_serial.zip也即附件中R7F0C807 Serial Master这个文件。现将关键配置代码贴出,并将给出注释如下:
SAU0EN = 1U; /* supply SAU0 clock */
SPS0 =0x00U; //Setclock frq 20Mhz
//clearthe SE00 bit to 0 and stops thecommunication operation
ST0 |=0x01U; /* stop CSI00 */
CSIMK00 =1U; /* disable INTCSI00 interrupt */
CSIIF00 =0U; /* clear INTCSI00 interrupt flag */
/*Set INTCSI00 low priority */
CSIPR100 = 1U;
CSIPR000 = 1U;
SIR00 =0x03U; /* clear error flag */
SMR00H = 0x00U;//CKS00 = 0 CCS00 = 0 STS00 = 0
SMR00L = 0x20U;//SIS000 = 0 MD001 = 0 MD000 = 0 transmit endinterrupt
// SMR00L = 0x21U;//SIS000 = 0 MD001 = 0 MD000= 1 buffer empty interrupt
// SCR00H = 0xC0U;//TXE00 = 1 RXE00 = 1 DAP00= 0 CKP00 = 0 0 0 0 0
SCR00H = 0xF0U;//TXE00 = 1 RXE00 = 1 DAP00 = 1 CKP00 = 1 0 00 0
SCR00L = 0x07U;//no check --MSB --no stop bit --7bits datalength
SDR00H |= 0x00U;//fmclk/2=10mhz 0000000
SDR00L = 0x00U;//serial data buffer register
CKO0 |=0x01U; /* CSI00 clock initial level */
SO0 &=(uint8_t)~0x01U; /* CSI00 SO initial level */
SOE0 |=0x01U; /* enable CSI00 output */
/*SI00*/
PMC0 &= 0x7FU;
PM0 |= 0x80U;
/*SO00*/
P0 |= 0x40U;
PM0 &= 0xBFU;
/*SCK00*/
PMC1 &= 0xFEU;
PM1 &= 0xFEU;
P1 |= 0x01U;
具体完整工程可参考附件AFE4490+DCM03 HWSPI.zip文件。在这里我们重点关注的有这么几个寄存器:SMR00H、SMR00L、SCR00H、SCR00L、SDR00H。
首先介绍下SMR00H和SMR00L寄存器,其具体介绍如下:
这两个寄存器确定了串行阵列单元的工作模式以及中断类型。接下来看看SCR00H和SCR00L这两个寄存器:
TXE00和RXE00的组合决定了CSI单元的通信模式,即全双工通信;而DAP00和CKP00则决定了SPI通信中最为重要的两个参数:CPOL(时钟极性)和CPHA(时钟相位)。根据CPOL和CPHA的不同组合,SPI可细分为4种工作方式。时钟极性(CPOL)对传输协议没有重大影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或者下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或者下降)数据被采样。主控和与之通信的外围设备的时钟相位和极性应该保持一致。
不同时钟相位下的SPI总线数据传输时序如下图所示:
根据AFE4490的DataSheet 52页写时序图和53页读时序图描述,如下图所示:
可以看出,CPOL应该取为0;CPHA应取0,即SPI串行时钟空闲为低,在第一个上升沿取样。因此,DAP00 = 1;CAP00 = 1;TXE00 = 1;RXE = 1。
DIR00置为0,即先发送高字节;DLS000置为1,配置通信数据8位数据长度,即一个字节。
最后,让我们看看SDR00H这个寄存器:
这个寄存器的配置决定了SPI工作速度,我们设为最快,在主时钟为20Mhz情况下,SPI通信速度达到了10M。
为了验证SPI的参数配置和通信时序,我拿手头的逻辑分析仪(Saleae16 最大3通道100M采样;配套软件为Saleae Logic 1.1.15)进行了波形的抓取,情况如下:
首先是通信速率验证:
然后是R7F0C809向AFE4490写入数据过程时序验证:
最后是AFE4490向R7F0C809返回数据的过程时序验证:
分析仪和硬件平台连接如下图所示:
至此,AFE4490的SPI通信调试告一段落,接下来就开始编写程序来进行血氧数据采集前的准备工作了。由于AFE4490在采集完一次血氧数据后ADC_RDY引脚会变高,等待主控去读取数据。因此我们将与之相连的引脚设置为上升沿触发。相关配置代码如下:
PM0 |= 0x02U;
PMC0 &= 0xFDU;
PMK4 = 1U;//disable intp4
PIF4 = 0U;//clear intp4 flag
PPR14 = 1U;
PPR04 = 1U;//
// EGN0 |= 0x10U;
// EGP0 &= 0x2FU;//intp4 Falling edgetrig
EGP0 |= 0x10U;
EGN0 &= 0x2FU;//intp4 Rising edge trig
PIF4 = 0U;//clear intp4 flag
PMK4 =0U;//enable intp4
完成这些以后,还需要注意的是保证PDNZ和RST引脚拉高到VCC电位。然后我们就可以利用AFE4490+DCM03正常的采集数据了。
附上2张采集图:
系统上电以后情景:
开始测量时的情景:
OLED前4行代表AFE4490采集到的LED2点亮时采样值、LED2熄灭时环境光的采样值、LED1点亮时采样值、LED1熄灭时环境光的采样值。LED2==RED;LED1==IR。
至此,血氧模块的数据采集就告一段落了,接下来开始其他部分的软件调试!
本文来自论坛,点击查看完整帖子内容。