This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AFE4400:代码帮助、LED 红色、IR 闪烁

Guru**** 2524460 points
Other Parts Discussed in Thread: AFE4400, MSP430F5529, AFE4400SPO2EVM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/730867/afe4400-help-in-code-led-red-ir-blinking

器件型号: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;
}
//
文件结束

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Yogesh、

    解决问题的一种方法是在运行两个代码后读取所有寄存器(数据表的寄存器映射中提供了列表)并查看差异。 稍后、您可以找到每种差异的原因。
    但请确保不要读取寄存器0x00、因为它是只写寄存器。

    此致、
    Prabin