注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
人民币的幻想的个人空间 https://home.eeworld.com.cn/space-uid-501762.html [收藏] [复制] [分享] [RSS]
日志

【R7F0C809】+AFE4490+DCM03程序调试完整过程

已有 4790 次阅读2015-11-18 21:00 |个人分类:瑞萨

硬件部分确定后,就着手于软件调试了。秉持着先难后易的原则,首先就开始了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文件。在这里我们重点关注的有这么几个寄存器:SMR00HSMR00LSCR00HSCR00LSDR00H
首先介绍下SMR00HSMR00L寄存器,其具体介绍如下:
     


这两个寄存器确定了串行阵列单元的工作模式以及中断类型。接下来看看SCR00HSCR00L这两个寄存器:
  
TXE00RXE00的组合决定了CSI单元的通信模式,即全双工通信;而DAP00CKP00则决定了SPI通信中最为重要的两个参数:CPOL(时钟极性)和CPHA(时钟相位)。根据CPOLCPHA的不同组合,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。
至此,血氧模块的数据采集就告一段落了,接下来开始其他部分的软件调试!

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章