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.

[参考译文] AFE4404:AFE4404、I2C

Guru**** 2540720 points
Other Parts Discussed in Thread: AFE4404, AFE4404EVM

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/877423/afe4404-afe4404-i2c

器件型号:AFE4404

Praveen 

我对 AFE4404有一些问题。  
我将其与 Arduino IDE 和 SFH7072上的 ESP32搭配使用  
我在这些传感器上编写了一个代码、但不了解如何正确处理寄存器设置。
需要相关帮助。
谢谢、

此致、
Nishikant

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

    #include
    #include
    #include
    const int Resetz = 15;
    CONST int ADC_RDY = 4;
    #define HRM_ADD 0x58
    #define ADC_STEP_SIZE 0.0000057220458984
    define MAX 500
    双 ADC_;
    双精度 arr_0x2A[MAX]、arr_0x2B[MAX]、arr_0x2C[MAX]、arr_0x2D[MAX]、arr_0x2E[MAX]、 ARR_0x2F[MAX]、ARR_40[MAX];
    void setup(){
    Wire.begin();
    Serial.begin(115200);
    PinMode (Resetz、输出);
    引脚模式(ADC_RDY、输入);
    PinMode (Resetz、输出);
    引脚模式(ADC_RDY、输入);
    HRM_POWER_ON ();//打开 AFE 并触发
    AFE_Reg_Init();//启用寄存器写入
    Set_All_reg ();//写入所有寄存器
    HRM_POWER_DOWN ();//关闭电源
    延迟(1000);

    void loop(){
    //将主代码放在此处,重复运行:
    HRM_POWER_ON ();//打开 AFE 并触发
    AFE_Reg_Init();//启用寄存器写入
    Set_All_reg ();//写入所有寄存器
    延迟(100);
    AFE_Enable_Read ();//读取使能
    // Serial.println ("adc_RDY input>>>>>>>>>>>>>>>>>>>) ");
    // int ADC = digitalRead (ADC_RDY);
    // Serial.println (ADC);
    //如果(ADC > 0){
    // Serial.println ("adc_RDY 输入可用");
    //}
    // Serial.println ("adc_RDY input>>>>>>>>>>>>>>>>>>>) ");
    INT 计数= 0;

    while (count <= 20)

    //Serial.print ("0x2A:");
    ADC_= AFE_Reg_Read (0x2A);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    //Serial.print (adc、hex);
    ARR_0x2A[count]= ADC_;
    // Serial.println ("\n");
    //Serial.print ("0x2B:");
    ADC_= AFE_Reg_Read (0x2B);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    //Serial.print (adc、hex);
    ARR_0x2B[计数]= ADC_;
    // Serial.println ("\n");
    // Serial.print ("0x2C:");
    ADC_= AFE_Reg_Read (0x2C);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    // Serial.print (adc、hex);
    ARR_0x2C[count]= ADC_;
    // Serial.println ("\n");
    // Serial.print ("0x2D:");
    ADC_= AFE_Reg_Read (0x2D);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    // Serial.print (adc、hex);
    ARR_0x2D[计数]= ADC_;
    // Serial.println ("\n");
    // Serial.print ("0x2E:");
    ADC_= AFE_Reg_Read (0x2E);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    // Serial.print (adc、hex);
    ARR_0x2E[count]= ADC_;
    // Serial.println ("\n");
    // Serial.print ("0x2F:");
    ADC_= AFE_Reg_Read (0x2F);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    // Serial.print (adc、hex);
    ARR_0x2F[计数]= ADC_;
    // Serial.println ("\n");
    // Serial.print ("0x40:");
    ADC_= AFE_Reg_Read (0x40);
    ADC_*= ADC_STEP_SIZE;
    ADC_*= 0.1;
    // Serial.print (adc、hex);
    arr_R_40[计数]= ADC_;
    serial.println ("\n"\});
    count++;
    延迟(40);

    //AFE_Reg_Read (47);
    AFE_Disable_Read ();
    HRM_POWER_DOWN ();//关闭电源
    serial.println ("########### ");
    对于(int k = 0;k <= 20;k++){
    serial.print ("arr_0x2A:::");serial.println (arr_0x2A[k]、DEC);
    serial.print ("arr_0x2B:::");serial.println (arr_0x2B[k]、DEC);
    serial.print ("arr_0x2C::");serial.println (arr_0x2C[k]、DEC);
    serial.print ("arr_0x2D::::");serial.println (arr_0x2D[k]、DEC);
    serial.print ("arr_0x2E::::");serial.println (arr_0x2e[k]、DEC);
    serial.print ("arr_0x2F:::");serial.println (arr_0x2F[k]、DEC);
    serial.print ("arr_R_40:::");serial.println (arr_R_40[k]、DEC);
    延迟(1000);

    serial.println("");
    延迟(1000000);

    /********
    HRM 通电
    (小部分 /
    void HRM_POWER_ON (){
    serial.println ("HRM_POWER_ON");
    延迟(1000);
    digitalWrite (Resetz、HIGH);//AFE 初始化
    延迟(10);
    digitalWrite (Resetz、low);
    delayMicroseconds (35);/25us 至50us。
    digitalWrite (Resetz、HIGH);//通过将 RESETZ =低电平设置为25 - 50us 来重置内部寄存器
    延迟(10);

    /********
    通过将 RESETZ 引脚设置为低电平200us 以上来断电
    秘书长的报告 /
    void HRM_POWER_DOWN (){
    serial.println ("\nHRM_POWER_DOWN");
    延迟(100);
    digitalWrite (Resetz、low);
    delayMicroseconds (200);

    /*********
    重新注册器写入模式
    (小部分 /
    void AFE_Reg_Init(){
    serial.println ("设置 init 寄存器");
    延迟(1000);
    Wire.beginTransmission(HRM_ADD);
    AFE_Reg_Write (0x00、0x000000);

    / /
    /* AFE4404_Enable_Read */
    / /
    void AFE_Enable_Read ()//禁止写入寄存器

    //Serial.println ("AFE_Reg_Read");
    延迟(10);
    字节 configData[3];
    CONFIGData[0]= 0x00;
    CONFIGData[1]= 0x00;
    CONFIGData[2]= 0x01;
    I2C_WRITE (0x00、configData);

    / /
    /* AFE4404_Disable_Read */
    / /
    void AFE_Disable_read ()//Permitt 写入寄存器

    // Serial.println ("AFE_Reg_disable read");
    延迟(10);
    字节 configData[3];
    CONFIGData[0]= 0x00;
    CONFIGData[1]= 0x00;
    CONFIGData[2]= 0x00;
    I2C_WRITE (0x00、configData);

    /*********
    重新生成器写入
    (小部分 /
    void AFE_Reg_Write (int reg_address、unsigned long data1)

    字节 configData[3];

    configData[0]=(byte)(data1 >> 16);
    configData[1]=(字节)((((data1和0x00FFFF)>> 8));
    configData[2]=(字节)((((data1 & 0x0000FF)));

    I2C_WRITE (reg_address、configData);

    char i2c_write (int reg_address、byte configData[])

    int TRANS_END = 0;
    Wire.beginTransmission(HRM_ADD);
    // Serial.println (reg_address);
    Wire.write (reg_address);
    // Serial.print (configData[0]);
    // Wire.write (configData[0]);
    // Serial.print (configData[1]);
    // Wire.write (configData[1]);
    // Serial.print (configData[2]);
    // Wire.write (configData[2]);
    Wire.write (configData、3);
    wire.endTransmission ();
    延迟(1);
    // Serial.println (");
    返回(TRANS_END);


    / /
    /* AFE4404_Reg_Read */
    / /
    带符号长 AFE_Reg_Read (int reg_address)

    字节 configData[3];
    带符号长整型返回值;
    I2C_Read (reg_address、configData);
    RetVal = CONFIGData[0];
    RetVal =(RetVal << 8)| CONFIGData[1];
    RetVal =(RetVal << 8)| CONFIGData[2];
    //Serial.println ("######### hex_value###### ");
    serial.print (reg_address);Serial.print (":");Serial.println (RetVal);
    //Serial.println ("######### hex_value###### ");
    延迟(200);
    if (reg_address >= 0x2A && reg_address <= 0x40)

    if (RetVal & 0x00200000)//检查 ADC 值是正值还是负值

    RetVal &= 0x003FFFFF;//将其转换为22位值
    serial.print (reg_address);serial.print (":::将其转换为22位值 cos -ve:");Serial.println (RetVal);
    返回(RetVal ^ 0xFFC00000);


    // Serial.println ("######### RetVal ^ 0xFFC00000########## ");
    // Serial.print (reg_address);Serial.print (":");Serial.println (RetVal);
    // Serial.println ("######### conversion 值######## ");
    //延迟(1000);
    返回 RetVal;

    char i2c_read (int reg_address、字节*读取_Data){
    int TRANS_END = 0;
    int byteCount = 3;
    Wire.beginTransmission(0x58);
    Wire.write (reg_address);
    wire.endTransmission ();
    Wire.requestFrom (0x58、3);
    延迟(10);
    while (Wire.Available ()&&(byteCount!= 0))

    *Read_Data++= Wire.Read();
    字节计数--;

    返回(TRANS_END);

    /*********
    设置所有写入寄存器
    秘书长的报告 /
    void set_all_reg (){

    AFE_Reg_Write (01、0x000064);//1h
    AFE_Reg_Write (02、0x00018E);
    AFE_Reg_Write (03、0x000320);
    AFE_Reg_Write (04、0x0004AE);
    AFE_Reg_Write (05、0x0001F4);
    AFE_Reg_Write (06、0x00031E);
    AFE_Reg_Write (07、0x000384);
    AFE_Reg_Write (0x08、0x0004AE);
    AFE_Reg_Write (0x09、0x000000);
    AFE_Reg_Write (10、0x00018E);
    AFE_Reg_Write (11、0x0000514);
    AFE_Reg_Write (12、0x00063E);
    AFE_Reg_Write (13、0x0015E8);
    AFE_Reg_Write (14、0x0017B3);
    AFE_Reg_Write (15、0x0017BD);
    AFE_Reg_Write (16、0x001988);
    AFE_Reg_Write (17、0x001992);
    AFE_Reg_Write (18、0x001B5E);
    AFE_Reg_Write (19、0x001B68);
    AFE_Reg_Write (20、0x001D33);
    AFE_Reg_Write (21、0x0015E0);
    AFE_Reg_Write (22、0x0015E6);
    AFE_Reg_Write (23、0x0017B5);
    AFE_Reg_Write (24、0x0017BB);
    AFE_Reg_Write (25、0x00198A);
    AFE_Reg_Write (26、0x001990);
    AFE_Reg_Write (27、0x001B60);
    AFE_Reg_Write (28、0x001B66);
    AFE_Reg_Write (29、0x009C3F);
    AFE_Reg_Write (30、0x000103);//1E //0000//160 millisec//103 101/02
    AFE_Reg_Write (32、0x008000);// 20h//8000
    AFE_Reg_Write (33、0x000003);//21h 增益1
    /*1. 第一次测试:将22h 寄存器设置为000A00 (红色 LED)-在本例中,哪个 LED 闪烁/亮起
    2.第二次测试:将22h 寄存器设置为000280,然后重新运行程序-在这种情况下,哪个 LED 闪烁/亮起。
    3.第三次测试:将22h 寄存器设置为00000A,然后重新运行程序-在这种情况下,哪个 LED 闪烁/亮起。 *
    AFE_Reg_Write (34、0x000104);/22h LED A28A 104
    AFE_Reg_Write (35、0x000200);/23.
    AFE_Reg_Write (41、0x000000);/29
    AFE_Reg_Write (49、0x000000);//31
    AFE_Reg_Write (50、0x001DFB);//32
    AFE_Reg_Write (51、0x00991F);//33
    AFE_Reg_Write (52、0x000000);//34
    AFE_Reg_Write (53、0x000000);//35
    AFE_Reg_Write (54、0x000000);///两个 LED 模式36
    AFE_Reg_Write (55、0x000000);//37
    AFE_Reg_Write (57、0x000000);//39
    AFE_Reg_Write (58、0x000000);//3A 偏移电流
    AFE_Reg_Write (61、0x000020);//////20抽取模式开启

    您能否查看我的代码以了解设置是否正确、或者我是否需要更正一些缺失的问题?

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

    Nishikant、您好!

    请确保您能够使 SPI 寄存器写入和读取正常工作。 如果您能够做到这一点、您的帖子不清楚。

    成功建立 AFE 和 MCU 之间的通信后、您可以配置 AFE。 您可以查看数据表(表11或12)以了解需要使用对 AFE 进行编程的默认寄存器设置。 或者、您也可以在仿真模式下使用 GUI 来配置 AFE 并导出寄存器设置。  

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

    Praveen、您好!
    很抱歉、我的回答很晚、我配置正确、我还得到一些读数、通信正常、我可以将 LED 电流更改为。   
    请检查此代码,寄存器值是否正确??

    e2e.ti.com/.../0385.hrm.txt###

    e2e.ti.com/.../HRM1.txt

    我得到了这些读取 wrt 代码  


    e2e.ti.com/.../Ai2.txt

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

    Praveen  Aroul、您好!

    这是写入寄存器的正确方法吗?  

    void AFE_Reg_Write (int reg_address、unsigned long data1)//在 data1中,我发送24位数据(0x00018E)
    {
    byte configData[3];
    configData[0]=(byte)(data1 >> 16);
    configData[1]=(byte)((((((sys2c & 0x00FFFF))>>
    ));configData[byte)
    、configData](byte);configData[1]=(byte)
    
    
    char i2c_write (int reg_address、byte configData[])
    {
    /*24 bit data writtern on register in MSB first pattern */
    int tras_end = 0;
    Wire.beginTransmission(HRM_ADD);
    // Serial.println (reg_address);
    Wire.write (reg_address);
    // Serial.print (configData[0]);
    Wire.write (configData[0]);//MSB
    // Serial.print (configData[1]);
    Wire.write (configData[1]);
    // Serial.print (configData[2]);
    Wire.write (configData[2]);//LSB
    // Wire.write (configData、 3);//LSB
    Wire.endTransmission ();
    delay (10);
    // Serial.println (");
    return (TRANS_END);
    }
    

    如果我出错、请改正。
    谢谢你

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

    Nishi、

    我检查了您的寄存器设置并发现了一个错误。

    您已将转换时间设置为115us。 但平均值数量设置为4 (NUMAV 为3)、在这种情况下、最小所需的 ADC 转换时间为265us。

    您可能需要将 NUMAV 更改为1。

    我没有 Arduino 方面的专业知识。 因此无法对代码进行注释。

    我建议您参阅 AFE4404EVM 产品文件夹(https://www.ti.com/product/AFE4404/technicaldocuments)中提供的 AFE4404EVM 固件源代码