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.

[参考译文] AFE49I30:与 I2C 接口通信时出现问题。

Guru**** 667810 points
Other Parts Discussed in Thread: AFE49I30, ADS1292R
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1235213/afe49i30-problem-on-communicating-with-i2c-interface

器件型号:AFE49I30
主题中讨论的其他器件: ADS1292R

我已经编写了一个用于初始化和控制 AFE49I30的代码。 我仔细阅读了数据表。 简单驱动程序文件(.c 文件)已完成。 但是、MCU 与 AFE49I30开始连接、但连接失败。 我将 nrf52840用作 MCU。 由于编写此芯片的驱动程序会很复杂、您能否查看我的代码以找出可能的错误? 主文件属于之前使用 ADS1292R 的项目。 但是、可能的问题可能出现在附件中的驱动程序文件(AFE49I30.c 和 AFE49I30.h)中。 主文件中的相关函数调用为:
twi_init();
INIT_AFE49I30 ();
AFE49I30_READ_ALL_REGS ();
AFE49I30_READ_DATA ((uint32_t *)&AFE_RAW_DATA);

由于此芯片具有保密协议限制、因此请保密此次查询。

/************************************************************************
                          include libraries

************************************************************************/

#include <string.h>
#include "nrf_drv_twi.h"
#include "nrf_delay.h"
#include "boards.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "AFE49I30.h"
//#include "nrf_drv_gpiote.h"
//#include "app_error.h"
//#include "app_util_platform.h"
//#include "nrf_gpio.h"
//#include "nrf_drv_spi.h"



/**********************************************************************
                           AFE49I30 Global Variables										                                  											  *

/**********************************************************************/
/* Common addresses definition */
#define AFE49I30_ADDR          0x5B

#define page0_size             58
#define page1_size             120


uint8_t AFE49I30_page1_address[page1_size];
uint32_t AFE49I30_page1_data[page1_size];
uint8_t AFE49I30_page0_address[page0_size];
uint32_t AFE49I30_page0_data[page0_size];
/**********************************************************************
                            I2C define

/*********************************************************************/
/* TWI instance ID. */
#define TWI_INSTANCE_ID     0

/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
/* Indicates if operation on TWI has ended. */
static volatile bool m_xfer_done = false;
static int twi_error=0;
/* Buffer for samples read fromsensor. */
static uint32_t m_sample;




/**********************************************************************
                           AFE49I30 functions									                                  											  *

/**********************************************************************/

/*--------------------------------------------------------------*/
/**
 * @brief Function for reading data from AFE49I30 through I2C
 *
 * @param[in] register address
 */
uint32_t AFE_Reg_Read(uint8_t reg_address)
{
    ret_code_t err_code;
    uint8_t configData[3];
    signed long retVal;

    err_code = nrf_drv_twi_tx(&m_twi, AFE49I30_ADDR, (uint8_t *)&reg_address, 1, true);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

    //I2C_read
    err_code = nrf_drv_twi_rx(&m_twi, AFE49I30_ADDR, (uint8_t *)&configData, 3);
    APP_ERROR_CHECK(err_code);

    retVal = configData[0];
    retVal = (retVal << 8) | configData[1];
    retVal = (retVal << 8) | configData[2];
    //if (reg_address >= 0x2A && reg_address <= 0x2F)
    //{
    //  if (retVal & 0x00200000)  // check if the ADC value is positive or negative
    //  {
    //    retVal &= 0x003FFFFF;   // convert it to a 22 bit value
    //    return (retVal^0xFFC00000);
    //  }
    //}
    retVal &= 0x003FFFFF;   // convert it to a 22 bit value
    return retVal;
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for writting data to AFE49I30 through I2C
 *
 * @param[in] register address and its content
 */
void AFE_Reg_Write (uint8_t reg_address, uint32_t data)
{
    ret_code_t err_code;
    uint8_t configData[3];
    //NRF_LOG_INFO("%x",data);

    configData[0]=(uint8_t) ((data & 0x00FFFFFF) >>16);
    configData[1]=(uint8_t) ((data & 0x0000FFFF) >>8);
    configData[2]=(uint8_t) (data & 0x000000FF);
    //I2C_write
    err_code = nrf_drv_twi_tx(&m_twi, AFE49I30_ADDR, (uint8_t *)&reg_address, 1, true);
    APP_ERROR_CHECK(err_code);
    NRF_LOG_INFO("test0,%x,%x,%x",AFE49I30_ADDR,reg_address,err_code);
    while (m_xfer_done == false)
    {
    //NRF_LOG_INFO("twi_error:%d",twi_error);
    }
    NRF_LOG_INFO("test1");
    err_code = nrf_drv_twi_tx(&m_twi, AFE49I30_ADDR, (uint8_t *)&configData, 3, true);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for page selection of AFE49I30.
 *
 * @param[in] page number
 */
void AFE49I30_page_sel(short page_num)
{
  uint8_t address=0x01;
  uint32_t page1=0x00000001;
  uint32_t page0=0x00000000;
  if(page_num==1) AFE_Reg_Write(address, page1);
  else if(page_num==0) AFE_Reg_Write(address, page0);
  else;
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for reading data from AFE49I30.
 *
 * @param[out] raw data
 */
void AFE49I30_read_data(uint32_t *raw_data)
{
  uint8_t FIFO_add = 0xFF;
  for (int i=0;i<Num_Phase;i++)
  {
    raw_data[i] = AFE_Reg_Read(FIFO_add); 
  }
  return;
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for reading AFE49I30 all registers.
 *
 */
void AFE49I30_read_all_regs(void)
{
  short page_num;
  nrf_delay_ms(1);
  uint32_t current_read;
  //---------read page1 registers------
  page_num=1;
  AFE49I30_page_sel(page_num);
  for (int i=0;i<page1_size;i++)
  {
    current_read = AFE_Reg_Read(AFE49I30_page1_address[i]); 
    NRF_LOG_INFO("reg:%x,%x\r\n",AFE49I30_page1_address[i], current_read); 
  }
  //---------read page0 registers------
  page_num=0;
  AFE49I30_page_sel(page_num);
  for (int i=0;i<page0_size;i++)
  {
    current_read = AFE_Reg_Read(AFE49I30_page0_address[i]);
    NRF_LOG_INFO("reg:%x,%x\r\n",AFE49I30_page0_address[i], current_read);  
  }
  //---------read enable register-------
  uint8_t enable_register_add=0x1D;
  current_read = AFE_Reg_Read(enable_register_add);  
  NRF_LOG_INFO("reg:%x,%x\r\n",enable_register_add, current_read);
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for initializing AFE49I30.
 *
 */
void init_AFE49I30(void)
{
  short page_num;
  nrf_delay_ms(1);
  AFE49I30_Hard_reset();
  nrf_delay_ms(1);
  //---------write page1 registers--------
  page_num=1;
  AFE49I30_page_sel(page_num);
  NRF_LOG_INFO("test2");
  for (int i=0;i<page1_size;i++)
  {
    NRF_LOG_INFO("test3");
    NRF_LOG_INFO("reg:%x,%x\r\n",AFE49I30_page1_address[i],AFE49I30_page1_data[i]);
    AFE_Reg_Write(AFE49I30_page1_address[i], AFE49I30_page1_data[i]);
  }
  //---------write page0 registers------
  page_num=0;
  AFE49I30_page_sel(page_num);
  for (int i=0;i<page0_size;i++)
  { 
    AFE_Reg_Write(AFE49I30_page0_address[i], AFE49I30_page0_data[i]);  
  }
  //---------write enable register-------
  uint8_t enable_register_add=0x1D;
  uint32_t enable_register_dat=0x00C000A0;
  AFE_Reg_Write(enable_register_add,enable_register_dat);  
}


/*--------------------------------------------------------------*/
/**
 * @brief Function for handling data.
 *
 * @param[in] temp
 */
__STATIC_INLINE void data_handler(uint32_t temp)
{
    NRF_LOG_INFO("Data is: %d", temp);
}


/*--------------------------------------------------------------*/
/**
 * @brief TWI events handler.
 *
 */
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
    switch (p_event->type)
    {
        case NRF_DRV_TWI_EVT_DONE:
            if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX)
            {
                data_handler(m_sample);
            }
            m_xfer_done = true;
            break;
        case NRF_DRV_TWI_EVT_ADDRESS_NACK:
            twi_error = 1;
            break;
        case NRF_DRV_TWI_EVT_DATA_NACK:
            twi_error = 2;
            break;
        default:
            break;
    }
}


/*--------------------------------------------------------------*/
/**
 * @brief TWI initialization.
 *
 */
void twi_init (void)
{
    ret_code_t err_code;
    const nrf_drv_twi_config_t twi_config = {
       .scl                = SCL1,
       .sda                = SDA1,
       .frequency          = NRF_DRV_TWI_FREQ_100K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };
    err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&m_twi);
    // To secure correct signal levels on the pins used by the TWI master when the system is in OFF mode, and
    // when the TWI master is disabled, SDA and SCL pins must be configured in the GPIO peripheral as follows:
    // SCL As specified in PSEL.SCL: Input H0D1
    // SDA As specified in PSEL.SDA: Input H0D1
    nrf_gpio_cfg(SDA1, NRF_GPIO_PIN_DIR_INPUT, NRF_GPIO_PIN_INPUT_CONNECT, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_H0D1, NRF_GPIO_PIN_NOSENSE);
    nrf_gpio_cfg(SCL1, NRF_GPIO_PIN_DIR_INPUT, NRF_GPIO_PIN_INPUT_CONNECT, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_H0D1, NRF_GPIO_PIN_NOSENSE);
    ////////#define  PIN_VDD_ENV    (22)
    ////////#define  PIN_R_PULLUP   ( 0+32)

    ////////nrf_gpio_pin_set(PIN_VDD_ENV);
    ////////nrf_gpio_pin_set(PIN_R_PULLUP);
    ////////// Power up and wait for voltage to rise
    ////////nrf_gpio_cfg(PIN_VDD_ENV,  NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_S0H1, NRF_GPIO_PIN_NOSENSE);
    ////////nrf_gpio_cfg(PIN_R_PULLUP, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_S0H1, NRF_GPIO_PIN_NOSENSE);
    nrf_delay_ms(20);
}


/*--------------------------------------------------------------*/
/**
 * @AFE49I30 hardware reset
 *
 */
void AFE49I30_Hard_reset(void)
{
  nrf_gpio_pin_set(AFE49I30_reset_pin);
  nrf_delay_us(30);
  nrf_gpio_pin_clear(AFE49I30_reset_pin);
  nrf_delay_us(30);
  nrf_gpio_pin_set(AFE49I30_reset_pin);
}
/*--------------------------------------------------------------*/

/*****************************************************************************
 
                    AFE49I30 page1 registers                                

*****************************************************************************/
uint8_t AFE49I30_page1_address[page1_size] = {
0x20,
0x21,
0x22,
0x23,
0x24,
0x25,
0x26,
0x27,
0x28,
0x29,
0x2A,
0x2B,
0x2C,
0x2D,
0x2E,
0x2F,
0x30,
0x31, 
0x32, 
0x33, 
0x34, 
0x35, 
0x36, 
0x37, 
0x38, 
0x39, 
0x3A, 
0x3B, 
0x3C, 
0x3D, 
0x3E, 
0x3F, 
0x40, 
0x41, 
0x42, 
0x43, 
0x44, 
0x45, 
0x46, 
0x47, 
0x48, 
0x49, 
0x4A, 
0x4B, 
0x4C, 
0x4D, 
0x4E, 
0x4F, 
0x50, 
0x51, 
0x52, 
0x53, 
0x54, 
0x55, 
0x56, 
0x57, 
0x58, 
0x59, 
0x5A, 
0x5B, 
0x5C, 
0x5D, 
0x5E, 
0x5F, 
0x60, 
0x61, 
0x62, 
0x63, 
0x64, 
0x65, 
0x66, 
0x67, 
0x68, 
0x69, 
0x6A, 
0x6B, 
0x6C, 
0x6D, 
0x6E, 
0x6F, 
0x70, 
0x71, 
0x72, 
0x73, 
0x74, 
0x75, 
0x76, 
0x77, 
0x78, 
0x79, 
0x7A, 
0x7B, 
0x7C, 
0x7D, 
0x7E, 
0x7F, 
0x80, 
0x81, 
0x82, 
0x83, 
0x84, 
0x85, 
0x86, 
0x87, 
0x88, 
0x89, 
0x8A, 
0x8B, 
0x8C, 
0x8D, 
0x8E, 
0x8F, 
0x90, 
0x91, 
0x92, 
0x93, 
0x94, 
0x95, 
0x96, 
0x97
};

uint32_t AFE49I30_page1_data[page1_size] = {
0x010000, 
0x0077B1, 
0x02000E, 
0x0017B0, 
0x050000, 
0x010001, 
0x00B4B1, 
0x02000E, 
0x0014B0, 
0x850014, 
0x010000, 
0x0054B1, 
0x06000E, 
0x0014B0, 
0x050000, 
0x000000, 
0x000021, 
0x080002, 
0x000020, 
0x000000, 
0x010000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x010000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x040000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x040000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x080000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x080000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x080000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x080000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x020000, 
0x000000, 
0x000000, 
0x000000, 
0x000000
};


/********************************************************************
 
                    AFE49I30 page0 registers (except 1Dh)                                

*********************************************************************/
uint8_t AFE49I30_page0_address[page0_size] = {
0x00, 
0x01, 
0x02, 
0x03, 
0x04,  
//0x1D, 
0x1E, 
0x23, 
0x24, 
0x25, 
0x29,  
0x42,  
0x4B, 
0x4E, 
0x4F, 
0x50, 
0x51, 
0x57, 
0x58, 
0x61, 
0x62, 
0x63, 
0x6C, 
0x6D, 
0x72, 
0x73,  
0x78, 
0x79, 
0x80,  
0x88, 
0x8A, 
0x8B, 
0x8C, 
0x8D, 
0x8E, 
0x8F, 
0x91, 
0x92, 
0x93, 
0x94, 
0x95, 
0x96, 
0x97, 
0x98, 
0x99, 
0x9A, 
0x9C, 
0x9D, 
0x9E, 
0xA0, 
0xA1, 
0xA2, 
0xA4, 
0xA5, 
0xA6, 
0xA9,
0xAA,
0xB4
};


uint32_t AFE49I30_page0_data[page0_size] = {
0x000000, 		
0x000000, 
0x600000, 
0x000000, 
0x000000, 
//0xC000A0, 
0x000000, 
0x068000, 
0x002000, 
0x000000, 
0x050000, 
0x0010E0,  
0x000000, 
0xFE8004, 
0x010004, 
0x100000, 
0x000000, 
0x000000, 
0x000000, 
0x080000, 
0x800000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x047C3C, 
0x80E005, 
0x00E005, 
0x000000, 
0x000003, 
0x000000, 
0x000100, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x000000, 
0x000084, 
0x000050, 
0x000000, 
0x000023,  
0x000000, 
0x200355, 
0x000000, 
0x000400, 
0x000015, 
0x000000, 
0x000400, 
0x000015, 
0x000000, 
0x000400, 
0x000015, 
0x000000, 
0x000000, 
0x000000, 
0x000000
};

#ifndef AFE49I30_H_
#define AFE49I30_H_


/******************************************************************************
                               AFE49I30 global definitions
******************************************************************************/
#define Num_Phase           6

/******************************************************************************
                               AFE49I30 pins definition
******************************************************************************/
#define AFE49I30_reset_pin  16
#define AFE49I30_DRDY_pin   25



/******************************************************************************
                               AFE49I30 global functions
******************************************************************************/
void twi_init (void);
void init_AFE49I30(void);
void AFE49I30_read_all_regs(void);
void AFE49I30_read_data(uint32_t *raw_data);
void AFE49I30_Hard_reset(void);



#endif /*AFE49I30_H_*/

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

    您好!  

    我们处理此部件的应用工程师目前正在度假。 因此、我们的响应会有所延迟。  

    我将与其他团队成员进行核实、并在6月14日前得到回复。

    感谢您的耐心。  

    卡尔蒂克

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

    您好!

    我需要更多的时间、并将在6月12日左右回复您。

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

    您好!

    如您所说、该器件受 NDA 控制、因此我将通过电子邮件与您联系。

    谢谢。

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

    是的、我明白了。 感谢您的观看和帮助

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

    没问题。 我期待您的回复

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

    您好!

    我向您发送了多封电子邮件。

    谢谢

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

    您好!

    我再次向您发送了包含您提供的新电子邮件地址的电子邮件。

    我将删除您的帖子、以便不要披露您的个人电子邮件。

    谢谢

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

    您好!

    您的电子邮件地址以  parsjahd.com 结尾是否设置正确?

    我曾尝试向您的公司和个人电子邮件地址发送电子邮件、但未能交付并被拒绝。

    谢谢

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

    您好!

    感谢您的答复。 很抱歉、您有任何疑问。 我想为您提供正确的公司电子邮件地址、即**********@parsjahd.com

    我知道您已经通过 TI E2E 平台向我发送了电子邮件、但很遗憾、我的公司电子邮件收件箱中没有收到这些电子邮件。 但是、我通过我的个人电子邮件地址收到了您的电子邮件、非常感谢您在与我联系时所给予的考虑和努力。

    我已经回复了您之前的电子邮件、我相信我的回复可能会进一步澄清我的问题。 我要对你的持续帮助和支持表示感谢。

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

    谢谢!

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

    回复您的 Gmail。 请向您的公司/机构/组织的官方电子邮件提供抄送(&C)。 我们继续电子邮件讨论、因为这个协议正在保密协议下。

    谢谢

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

    当然可以。 谢谢!

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

    我们将通过电子邮件进行沟通。 我将关闭此主题。

    谢谢