请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:AFE4400 主题中讨论的其他器件: MSP430F5529、
根据 AFE4400SPO2EVM、我们已将 AFE4400连接到 MSP430F5529。 当我们使用 AFE4400SPO2EVM 的代码对其进行编程时,SPO2探头的 LED 指示灯会像测试点一样闪烁(DB9连接器电压的引脚在1.2V 至4V 之间波动) 我这是唯一的程序问题、因为同样、如果我们通过其他示例代码对其进行编程、那么 DB9引脚电压是恒定的、即1.2V 四舍五入、但 LED 关闭。 那么、程序中的更改是什么、请给出建议。
/* * AFE44x0.c * *提供 AFE44x0 API * *版权所有(C) 2016德州仪器(TI)公司- http://www.ti.com/ *保留所有权利 * / #include "device.h" #include "types.h" //基本类型声明 #include "AFE44x0.h" / *原型* / / *全局变量* / #define DELAY_COUNT 2 个无符号长整型 AFE44xx_CURRENT_Register_Settings[36]={ control0_VAL、 //Reg0:control0:控制寄存器0 LED2STC_VAL、 //Reg1:REDSTARTCOUNT:红色样本开始计数 LED2ENDC_VAL、 //Reg2:REDENDCOUNT:红色结束计数 LED2LEDSTC_VAL 采样 、 //Reg3:REDLEDSTARTCOUNT:红色 LED 开始计数 LED2LEDENDC_VAL、 //Reg4:REDLEDENDCOUNT:红色 LED 结束计数 ALED2STC_VAL、 //Reg5:AMBREDSTARTCOUNT:环境红色样本开始计数 ALED2ENDC_VAL、 //Reg6:AMBREDENDCOUNT:环境红色结束计数 LED1STC_VAL 采样、 //Reg7:IRSTARTCOUNT:采样 IR 开始计数 LED1ENDC_VAL、 //Reg8:IRENDCOUNT:采样 IR 结束计数 LED1LEDSTC_VAL、 //Reg9:IRLEDSTARTCOUNT:IR LED 启动计数 LED1LEDENDC_VAL、 //Reg10:IRLEDENDCOUNT:IR LED 结束计数 ALED1STC_VAL、 //Reg11:AMBIRSTARTCOUNT:采样环境红外启动计数 ALED1ENDC_VAL、 //Reg12:AMBIRENDCOUNT:环境红外结束计数采样 LED2CONVST_VAL、 //Reg13:REDCONVSTART:REDCONVST LED2CONVEND_VAL、 //Reg14:REDCONVEND:红色转换结束计数 ALED2CONVST_VAL、 //Reg15:AMBREDCONVSTART:红色环境转换开始计数 ALED2CONVEND_VAL、 //Reg16:AMBREDCONVEND:红色环境转换结束计数 LED1CONVST_VAL、 //Reg17:IRCONVSTART:IR 转换开始计数 LED1CONVEND_VAL、 //Reg18:IRCONVEND:IR 转换结束计数 ALED1CONVST_VAL、 //Reg19:AMBIRCONVSTART:红外环境转换开始计数 ALED1CONVEND_VAL、 //Reg20:AMBIRCONVEND:红外环境转换结束计数 ADCRSTCT0_VAL、 //Reg21:ADCRESETSTCOUNT0:ADC 复位0开始计数 ADCRSTENDCT0_VAL、 //Reg22:ADCRESETENDCOUNT0:ADC 复位0结束计数 ADCRSTCT1_VAL、 //Reg23:ADCRESETSTCOUNT1:ADC 复位1开始计数 ADCRSTENDCT1_VAL、 //Reg24:ADCRESETENDCOUNT1:ADC 复位1结束计数 ADCRSTCT2_VAL、 //Reg25:ADCRESETENDCOUNT2:ADC 复位2开始计数 ADCRSTENDCT2_VAL、 //Reg26:ADCRESETENDCOUNT2:ADC 复位2结束计数 ADCRSTCT3_VAL、 //Reg27:ADCRESETENDCOUNT3:ADC 复位3开始计数 ADCRSTENDCT3_VAL、 //Reg28:ADCRESETENDCOUNT3:ADC 复位3结束计数 PRP、 //Reg29:PRPCOUNT:脉冲重复周期计数 CONTROL1:VAL、 //Reg30:CONTROL1:控制寄存器1 //启用计时器、平均值=3、PD_ALM 和 LED_ALM 引脚 0x00000上的红色和 IR LED 脉冲、 //Reg31:?:??? (ENSEPGAIN + STAGE2EN_LED1 + STG2GAIN_LED1_0dB + CF_LED1_5P + RF_LED1_1M)、 //Reg32:TIAGAIN:跨阻放大器增益设置寄存 器(AMBDAC_0uA + FLTCNRSEL_500Hz + STGE2EN_LED2 + STG2GAIN_LED2_0dB + CF_LED2_5P + RF_LED2_1M)、//Reg33:TIA_AMB_GAIN + STG2GAIN_LED2_0dB + CF_LED2_5P + RF_LER_RF_LERD1_1M 环境阻抗级(TRF_LENELIFR 级) //Reg34:LEDCNTRL:LED 控制寄存 器(TX_REF_1 + RST_CLK_ON_PD_ALM_PIN_DISABLE + ADC_BYP_DISABLE + TXBRGMOD_H_BRIDGE + DIGOUT_TRISE_DISABLE + XTAL_ENABLE + EN_FAST_DIAG + PDN_TX_OFF + PDN_AFE_OFF + PDN_AFE_OFF + PDN_OFF) //Reg35:CONTROL2:控制寄存器2 //bit 9 }; / *SPI 交互的变量* * / / *外部变量* / / * Init_AFE44xx_DRDY_Interrupt* / void Init_AFE44xx_DRDY_Interrupt (void) { P2DIR &=~AFE_ADC_DRDY; P2REN |= AFE_ADC_DRDY; //启用 P2.3内部电阻 P2OUT |= AFE_ADC_DRDY;//将 P2.3设置为上拉电阻 P2IES |= AFE_ADC_DRDY; // P2.3高/低边沿 P2IFG &=~AFE_ADC_DRDY;// P2.3 IFG 清除 P2IE &&~AFE_ADC_DRDY;//禁用 P2.3中断 } /********* * Enable_AFE44xx_DRDY_Interrupt* / void Enable_AFE44xx_DRDY_Interrupt (void) { P2IFG &=~AFE_ADC_DRDY;// P2.3 IFG 清除 P2IE |= AFE_ADC_DRDY;// P2.3中断已启用 } /************* * Disable_AFE44xx_DRDY_Interrupt* / void Disable_AFE44xx_DRDY_Interrupt (void) { P2IFG &=~AFE_ADC_DRDY;// P2.3 IFG 清除 P2IE &&~AFE_ADC_DRDY;//禁用 P2.3中断 } /********* * SET_GPIO* / void set_gpio (void) { //端口设置.. //端口1.1 - AFE_RESETZ、P1.2 - AFE_PDNZ、P2.3 - ADC_RDY、P2.4- PD_ALM、P2.5 - LED_ALM、 //P5.7 - DIAG_END P1SEL |= BIT0; P1DIR |= BIT0; P1OUT |= BIT0; P1DIR |=(AFE_RESETZ + AFE_PDNZ); P1OUT |=(AFE_RESETZ + AFE_PDNZ); P2DIR &=~(AFE_ADC_DRDY + AFE_PD_ALM + AFE_LED_ALM); P5DIR &=~AFE_DIAG_END; P2SEL = 0x00; P2DIR &= BIT0; P2OUT |=(BIT1 + BIT2 + BIT7); P2DIR |=(BIT1 | BIT2 | BIC7); } / * SET_UCB1_SPI* / void SET_UCB1_SPI (void) { P4SEL |= BIT1+BIT2+BIT3;//设置 SPI 外设位 P4DIR |= BIT0+BIT1 +BIT3;// STE、SCLK 和 DOUT 作为输出 P4DIR &=~BIT2;// Din 作为输入 P4OUT |=BIT0;//将 STE 设置为高 电平 UCB1CTL1 |= UCSWRST;//启用 SW 复位 UCB1CTL0 |= UCMSB+UCCKPH+UCMST+UCSYNC;//[b0] 1 -同步模式 //[B2-1] 00- 3引脚 SPI //[B3] 1 -主控模式 //[b4] 0 - 8位数据 //[B5] 1 - MSB6 -高极性/时钟。 //[B7] 1 -时钟相位-数据在第一个 UCLK 边沿上被捕捉并在下一个边沿上被改变。 UCB1CTL1 |= UCSSEL_2;// SMCLK UCB1BR0 = 0x01; // 16MHz UCB1BR1 = 0; // UCB1CTL1 &=~UCSWRST;//清除 SW 复位,恢复操作 UCB1IE = 0x0; //P4OUT &=~BIT0;//将 STE 设为低 电平} /********* * Init_AFE44xx_Resource* / void Init_AFE44xx_Resource (void) { SET_GPIO();//初始化 AFE44xx 的输入控制线 SET_UCB1_SPI ();//初始化 SPI 寄存器 。} / *AFE44xx 默认初始化* / void AFE44xx_Default_Reg_Init (void) { Disable_AFE44x0_SPI_Read (); AFE44x0_ReG_Write ((unsigned char) PRPCOUNT、(unsigned long) PRP); AFE44x0_ReG_Write (unsigned char) LED2STC、(unsigned long) LED2STC_VAL); AFE44x0_ReG_Write ((unsigned char) LED2ENDC、 (无符号长整型) LED2ENDC_VAL); AFE44x0_ReG_Write ((无符号字符) LED2LEDSTC、(无符号长整型) LED2LEDSTC_VAL); AFE44x0_ReG_Write ((无符号字符) LED2LEDENDC、(无符号长整型) LED2LED2LEVAL); AFE44x0_Reg_Write ((unsigned char) ALED2STC、(unsigned long) ALED2STC_VAL); AFE44x0_Reg_Write (unsigned char) ALED2ENDC、(unsigned long) ALED2ENDC_VAL); AFE44x0_ReG_Write (unsigned stchar ((unsigned stC) (无符号长整型) LED1STC_VAL); AFE44x0_Reg_Write ((无符号字符) LED1ENDC、(无符号长整型) LED1ENDC_VAL); AFE44x0_ReG_Write ((无符号字符) LED1LEDSTC、(无符号长整型) LED1LED1LEDSTC_VAL; AFE44x0_Reg_Write ((unsigned char) LED1LEDENDC、(unsigned long) LED1LEDENDC_VAL); AFE44x0_Reg_Write (unsigned char) ALED1STC、(unsigned long) ALED1STC_VAL);AFE44x0_Reg_Write ((unsigned char) (无符号长整型) ALED1ENDC_VAL); AFE44x0_Reg_Write ((unsigned char) LED2CONVST、(unsigned long) LED2CONVST_VAL); AFE44x0_ReG_Write (unsigned char) LED2CONVEND、(unsigned long) LED2VEND_CONVAL; AFE44x0_Reg_Write ((unsigned char) ALED2CONVST、(unsigned long) ALED2CONVST_VAL); AFE44x0_Reg_Write (unsigned char) ALED2CONVEND、( unsigned long) ALED2CONVEND_VAL;AFE44x0_REGL (unsigned VST、VCONCHAR) (无符号长整型) LED1CONVST_VAL); AFE44x0_Reg_Write ((无符号字符) LED1CONVEND、(无符号长整型) LED1CONVEND_VAL); AFE44x0_Reg_Write ((无符号字符) ALED1CONVST、(无符号长整型) ALED1CONVAL; AFE44x0_Reg_Write ((unsigned char) ALED1CONVEND、(unsigned long) ALED1CONVEND_VAL); AFE44x0_Reg_Write (unsigned char) ADCRSTCT0、( unsigned long) ADCRSTCT0_VAL);AFE44x0_RCON_Write (unsigned char (ADCRSTCT0) (无符号长整型) ADCRSTENDCT0_VAL); AFE44x0_Reg_Write ((unsigned char) ADCRSTCT1、(unsigned long) ADCRSTCT1_VAL); AFE44x0_ReG_Write (unsigned char) ADCRSTENDCT1、(unsigned long) ADCRSTCT1_VAL; AFE44x0_ReG_Write ((unsigned char) ADCRSTCT2、(unsigned long) ADCRSTCT2_VAL); AFE44x0_ReG_Write (unsigned char) ADCRSTENDCT2、(unsigned long) ADCRSTENDCT2_VAL); AFE44x0_ReG_Write ((unsigned char、ADCRSTCT3 (无符号长整型) ADCRSTCT3_VAL); AFE44x0_Reg_Write ((无符号字符) ADCRSTENDCT3、(无符号长整型) ADCRSTENDCT3_VAL); AFE44x0_Reg_Write ((unsigned char) control0、AFE44xx_Current_Register_Settings[0]); //0x00 AFE44x0_Reg_Write ((unsigned char) CONTROL2、AFE44xx_CURRENT_Register_Settings[35]); //0x23 AFE44x0_Reg_Write ((unsigned char) TIAGAIN、AFE44xx_CURRENT_Register_Settings[32]); //0x20 AFE44x0_Reg_Write ((unsigned char) TIA_AMB_GAIN、AFE44xx_CURRENT_Register_Settings[33]); //0x21 AFE44x0_ReG_Write ((unsigned char) LEDCNTRL、AFE44xx_CURRENT_Register_Settings[34]); //0x22 AFE44x0_Reg_Write ((unsigned char) CONTROL1、AFE44xx_CURRENT_Register_Settings[30]); //0x1E ENABLE_AFE44x0_SPI_READ (); } /************* *AFE44xx_Read_All_Regs* / void AFE44xx_read_all_Regs (unsigned long AFE44xxeg_buf[]) { unsigned char Regs_I; for (Regs_I = 0;Regs_I < 50;Regs_i++) { AFE44xxeg_buf[Regs_i]= AFE44xx_Reg_Read (Regs_I); } /********* / / *AFE44xx_PowerOn_Init* * / void AFE44xx_PowerOn_Init (void) { volatile unsigned short Init_i、j; Init_AFE44xx_Resource (); for (j = 0;j < delay_count;j++) { 对于(Init_I =0;Init_I < 20000;Init_i++); 对于(Init_I =0;Init_I < 20000;Init_i++); 对于(Init_I =0;Init_I < 20000;Init_i++); } Init_AFE44xx_DRDY_Interrupt (); AFE44xx_Default_Reg_Init(); } / *AFE44x0_ReG_Write* * / void AFE44x0_Reg_Write (unsigned char reg_address、unsigned long 数据) { unsigned char dummy_Rx; P4OUT&&=~0x01;// SEN 对于传输为低电平。 //循环展开以优化机器周期 UCB1TXBUF = REG_ADDRESS; //将第一个字节发送到 TX 缓冲区:寄存 器 while ((UCB1STAT 和 UCBUSY))的地址;// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF =(无符号字符)(数据>>16); //将第二个字节发送到 TX 缓冲区:DATA[23:16] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF =(无符号字符)((((data & 0x00FFFF)>>8)); //将第三个字节发送到 TX 缓冲区:DATA[15:8] while ((UCB1STAT & UCBUSY));// USCI_B1 TX 缓冲器就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF =(unsigned char)(((data & 0x0000FF)); //将第一个字节发送到 TX 缓冲区:DATA[7:0] while ((UCB1STAT & UCBUSY));// USCI_B1 TX 缓冲器就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf P4OUT|=0x01;// SEN 高 电平} /***************** *AFE44x0_Reg_Read* * / unsigned long AFE44x0_ReG_Read (unsigned char ReG_address) { unsigned char SPI_Rx_buf[4]; unsigned long RetVal; RetVal = 0; P4OUT&=~0x01;// SEN 低电平用于传输。 //针对机器周期优化的循环展开 UCB1TXBUF = ReG_ADDRESS; //将第一个字节发送到 TX 缓冲区:寄存 器 while ((UCB1STAT 和 UCBUSY))的地址;// USCI_B1 TX 缓冲区准备就绪? SPI_RX_BUF[0]= UCB1RXBUF;//读取 Rx BUF UCB1TXBUF = 0; //将第二个字节发送到 TX 缓冲区:虚拟数据 while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? SPI_RX_buf[1]= UCB1RXBUF;//读取 Rx buf:DATA[23:16] UCB1TXBUF = 0; //将第三个字节发送到 TX 缓冲区:虚拟数据 while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? SPI_RX_buf[2]= UCB1RXBUF;//读取 Rx buf:DATA[15:8] UCB1TXBUF = 0; //将第一个字节发送到 TX 缓冲区:虚拟数据 while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? SPI_Rx_BUF[3]= UCB1RXBUF;//读取 Rx buf:DATA[7:0] P4OUT|=0x01;//在传输结束时设置高 电平 RetVal = SPI_RX_BUF[1]; 接收=(RetVal << 8)| SPI_**_BUF[2];</<SPI_返 送= (SPI_0Val =3|<SPI_返 送) *ENABLE_AFE44x0_SPI_READ* / void Enable_AFE44x0_SPI_Read (void) { unsigned char dummy_Rx; //设置 control0 -启用 SPI 读取位 P4OUT&&~0x01; // CS 低电平用于传输开始。 //循环展开以优化机器周期 UCB1TXBUF = 0; //将第一个字节发送到 TX 缓冲区:寄存 器 while ((UCB1STAT 和 UCBUSY))的地址;// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 0; //将第二个字节发送到 TX 缓冲区:DATA[23:16] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 0; //将第三个字节发送到 TX 缓冲区:DATA[15:8] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 1; //将第一个字节发送到 TX 缓冲区:DATA[7:0] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf P4OUT|=0x01; //传输结束时 CS 为高 电平} /************* *DISABLE_AFE44x0_SPI_READ* / void Disable_AFE44x0_SPI_read (void) { unsigned char dummy_Rx; //设置 control0 -禁用 SPI 读取位 P4OUT&&~0x01; // CS 低电平用于传输开始。 //循环展开以优化机器周期 UCB1TXBUF = 0; //将第一个字节发送到 TX 缓冲区:寄存 器 while ((UCB1STAT 和 UCBUSY))的地址;// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 0; //将第二个字节发送到 TX 缓冲区:DATA[23:16] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 0; //将第三个字节发送到 TX 缓冲区:DATA[15:8] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf UCB1TXBUF = 0; //将第一个字节发送到 TX 缓冲区:DATA[7:0] while ((UCB1STAT 和 UCBUSY));// USCI_B1 TX 缓冲区准备就绪? dummy_Rx = UCB1RXBUF;//虚拟读取 Rx buf P4OUT|=0x01; //传输结束时 CS 为高 电平} /***************** / / // 回显字符 #pragma vector=USCI_B1_vector __interrupt void USCI_B1_ISR (void) { switch (UCB1IV) { case 0:break; //向量0 -无中断 情况2:break; //向量2 - RXIFG 情况4:中断; //向量4 - TXIFG 默认值:break; } // 文件结束