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与 Arduino MEGA 配合使用

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

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/589846/afe4404-using-the-afe4404-with-an-arduino-mega

器件型号:AFE4404

我尝试使用 TI 为其 AFE4404EVM 软件提供的源代码来设置 AFE4404。 由于我使用的设置与评估模块不同、我现在遇到了一些问题、想问是否有人可以帮助我。

我使用 Arduino MEGA 与 Osrams SFH 7060配合使用来控制 AFE4404。 我没有太多的时间来完成我的文凭论文、这使我只使用了 SFH 7060´s LED´s 之一。 起初、我试图通过 I2C 简单地打开 LED、但却无法使其正常工作。 程序在第一次尝试通过 I2C 线路发送内容时停止。

然后、我尝试简单地查看 AFE 是否使用仅识别连接的 I2C 器件的预编译程序对 I2C 器件做出响应。 该程序适用于我获得的其他器件、但如果我将电路板连接到上面的 AFE、则会n´t。 它似乎会阻止通过 I2C 线路的每一个流量。

我从 Nick Gammon 获得了该计划、网址为 :http://www.gammon.com.au/i2c

在设置程序时、由于 AFE 功能的使用非常有限、我离开了很多原始源代码。 ´m 您能告诉我、无论我使用多少 AFE 函数、我是否错过了一些重要的内容?

我´m 了我的个人源代码和电路板的电路图、以便您了解我所做的工作。

如果有一些帮助、我将不胜感激。

此致、

Simon

#include 

/* Pinbelegung */

int RESETZ = 4;

/* Variableendekexion*/

float befehl = 0;
int AFE_ADDR = 88;


/* AFE440X 寄存器*/

#define AFE_CONTROL0 0x00
#define AFE_LED2STC 0x01
#define AFE_LED2ENDC 0x02
#define AFE_LED1LEDSTC 0x03
#define AFE_LED1LEDENDC 0x04
#define AFE_ALED2STC 0x05
#define AFE_ALED2ENDC 0x06
#define AFE_LED1STC 0x07
#define AFE_LED1ENDC 0x08
#define AFE_LED2LEDSTC 0x09
#define AFE_LED2LEDENDC 0x0A
#define AFE_ALED1STC 0x0B
#define AFE_ALED1ENDC 0x0C
#define AFE_LED2CONVST 0x0D
#define AFE_LED2CONVEND 0x0E
#define AFE_ALED2CONVST 0x0F
#define AFE_ALED2CONVEND 0x10
#define AFE_LED1CONVST 0x11
#define AFE_LED1CONVEND 0x12
#define AFE_ALED1CONVST 0x13
#define AFE_ALED1CONVEND 0x14
#define AFE_ADCRSTCT0 0x15
#define AFE_ADCRSTENDCT0 0x16
#define AFE_ADCRSTCT1 0x17
#define AFE_ADCRSTENDCT1 0x18
#define AFE_ADCRSTCT2 0x19
#define AFE_ADCRSTENDCT2 0x1A
#define AFE_ADCRSTCT3 0x1b
#define AFE_ADCRSTENDCT3 0x1c
#define AFE_PRPCOUNT 0x1d
#define AFE_CONTROL1 0x1E
#define AFE_TIA_GAIN_SEP 0x20
#define AFE_TIA_GAIN 0x21
#define AFE_LEDCNTRL 0x22
#define AFE_CONTROL2 0x23
#define AFE_ALARM 0x29
#define AFE_LED2VAL 0x2a
#define AFE_ALED2VAL 0x2b
#define AFE_LED1VAL 0x2C
#define AFE_ALED1VAL 0x2D
#define AFE_LED2_ALED2VAL 0x2E
#define AFE_LED1_ALED1VAL 0x2F
#define AFE_CONTROL3 0x31
#define AFE_PDNCYCLESTC 0x32
#define AFE_PDNCYCLEENDC 0x33
#define AFE_PROG_TG_STC 0x34
#define AFE_PROG_TG_ENDC 0x35
#define AFE_LED3LEDSTC 0x36
#define AFE_LED3LEDENDC 0x37
#define AFE_CLKDIV_PRF 0x39
#define AFE_OFFDAC 0x3a
#define AFE_DEC 0x3D
#define AFE_AVG_LED2_ALED2VAL 0x3F
#define AFE_AVG_LED1_ALED1VAL 0x40



void setup(){
//将您的设置代码放在此处,以运行一次:

Serial.begin(19200);
Wire.begin();
pinMode (RESETZ,输出);
AFE_RESETZ_Init();
AFE_Trigger_HWReset ();
AFE_Init();
Serial.println ("按'1'启动、然后按'2'停止");
}

void loop (){
//将主代码放在此处,重复运行:

if (befehl ==1)
{
AFE_Reg_Write (9、0);
befehl = 0;
}如果(befehl == 2)
{
AFE_Reg_Write (10、0);
befehl = 0;
}


/********* //*
奥斯勒森德斯特列伦·艾根贝利斯特 */
********* /void
serialEvent()
{
befehl = serial.parseFloat();
}/*******************
//*
AFE4404_Initializierung zum Start */
********* /

void AFE_Init()
{
AFE_RESETZ_Init();
AFE_Enable_HWPDN ();
AFE_Disable_HWPDN ();
AFE_Trigger_HWReset ();
//AFE_CLK_Init();
AFE_Reg_Init();

}/*********

//*
AFE4404_Registerinitiizierung */
********* /
void AFE_Reg_Init()
{
AFE_Reg_Write (34、0x0033C3);
}


/ //*
AFE4404_Enable_Read */
********* /
void AFE_Enable_Read () //禁止写入寄存器
{
字节 configData[3];
configData[0]= 0x00;
configData[1]= 0x00;
configData[2]= 0x01;
I2C_WRITE (AFE_ADDR、 AFE_CONTROM0、CONFIGData、3);
}

/********* //*
AFE4404_Disable_read */
********* /
void AFE_Disable_read () //Permitt 写入寄存器
{
byte configData[3];
configData[0]= 0x00;
configData[1]=0x00;
configData[2]=0x00;
I2C_WRITE (AFE_ADDR、 AFE_CONTROM0、CONFIGData、3);
}

/********* //*
RESETZ DES AFE4404线卡初始化 */
********* /
void AFE_RESETZ_Init()
{
digitalWrite (RESETZ、HIGH);
}

/ //*
通过将 RESETZ =低电平设置为25 - 50us 来复位内部寄存器 */
********* /
void AFE_Trigger_HWReset()
{
digitalWrite (RESETZ、low); //set Arduino 引脚22-29 low
delayMicroseconds (30);
digitalWrite (RESETZ、HIGH); //设置 Arduino 引脚22-29高
延迟(10);
}/*****************

//*
AFE4404断电 */
********* /
void AFE_Enable_HWPDN ()
{
digitalWrite (RESETZ、low); //通过将 RESETZ 引脚设置为低电平并
延迟200us 以上来关闭电源(10);
}/*************

//*
AFE4404上电 */
********* /
void AFE_Disable_HWPDN ()
{
digitalWrite (RESETZ、HIGH); //通过将 RESETZ 引脚设置为高电平为 AFE 加电
延迟(10);
}

/ //*
AFE4404将时钟模式设置为内部 */
********* /
void AFE_CLK_Init()
{
AFE_Reg_Write (35、0x104218); //将 CLK 模式设置为内部时钟(默认 Wert:124218 mit interner CLK)
AFE_Reg_Write (41、0x2); //don´t 将内部时钟设置为 CLK 引脚供外部使用
AFE_Reg_Write (49、0x000021); //外部时钟模式的分频比设置为适合 Arduino Mega 16MHz
AFE_Reg_Write (57、0); //将 Lowes 采样率设置为61Hz (~17ms)
}

/*************** //*
AFE4404_Reg_Write */
********* /
void AFE_Reg_Write (int reg_address、unsigned long data)
{
byte configData[3];
configData[0](byte)(data >> 16);
configData[1]=(byte)((((data & 0x00FFFF)>>8));
configData[2]=(
reg)((data & 0x0000FFFF)、AFTER_WRITE)、I2C_ADDRE 3);
}

/ //*
AFE4404_Reg_Read */
********* /
带符号长 AFE_Reg_Read (int reg_address)
{
byte configData[3];
带符号长整型返回值;
I2C_Read (AFE_ADDR、REG_address、configData、 3);
RetVal = configData[0];
RetVal =(RetVal << 8)| CONFIGData[1];
RetVal =(RetVal << 8)| CONFIGData[2];
if (reg_address >= 0x2A & reg_address <= 0x2F)
{
if (RetVal & 0x00200000)//检查 ADC 值是正值还是负值
{
RetVal &= 0x003FFFFF;//将其转换为22位值
返回(RetVal^0xFFC00000);
}
}
返回值;
}

/********* //*
写入 I2C 上的 AFE */
********* /
char I2C_write (int slave_address、int reg_address、byte configData[]、int byteCount)
{
int tras_end = 0;
signed long RetVal;

Wire.beginTransmission(slave_address);
Wire.write (reg_address);
Serial.print (configData[0]);
Serial.print ("、");
Serial.print (configData[1]);
serial.print ("、");
serial.println (configData[2]);
configVal = configData[0];
RetVal =(RetVal << 8)| configData[1];
RetVal =(configVal << 8)| configData[2];
Serial.printn (RetVal);
Serial.println (reg_write
);Data.Wire (configData);
serial.println ("test");
Wire.endTransmission ();
return (TRANS_END);

// while (1)
{
if (字节计数= 0)
{
wire.endTransmission ();
serial.println ("test");
返回(TRANS_END);
}否则{
//unsigned int reg_data =(unsigned int)* write_data++;
Wire.write (configData、3);
字节计数-;
}
}*/


}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}--> //*
读取 I2C 上 AFE 的数据 */
********* /
char I2C_read (int slave_address、int reg_address、byte *读取数据、int byteCount)
{
int tras_end = 0;

Wire.beginTransmission(slave_address);
Wire.write (reg_address);
Wire.endTransmission ();
Wire.requestFrom (slave_address、3);
while (Wire.Available ()&&(byteCount!= 0)
){
*Read_Data++= Wire.Read();
字节计数--;
}
返回(TRANS_END);
}

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

    您好、Simon、

    我看不到原理图。

    为了缩小问题范围、您能否提供以下信息。
    1) 1) AFE4404在 您发送用于任何 I2C 操作的 Salve 地址后是否提供 ACK? 如果不是、从器件地址是什么? 您能否在任何 I2C 操作期间共享 I2C_CLK 和 I2C_DATA 引脚的模拟波形。
    2) 2)假设 AFE4404提供 ACK、您能否在 I2C_Write (0x23、0x01)之后测量 AFE 的 INP 引脚上的电压? 在执行此 I2C 写入操作之前、还应进行测量。

    此致、
    Prabin

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

     ´m 不检查我的帖子。 我希望这次附上原理图。 我在 AFE 上没有任何工作、因为 I2C 通信在第一次尝试发送数据时就停止了。 我将在接下来的几天内获得 I2C 线路的一些模拟波形、并在之后与您分享。

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

    Prabin、您好!

    我很遗憾地说,我还没有得到适当的波形来分享。 我不在´m。  

    我再生产了一个板、上面有 AFE、并稍微修改了我的源代码。 I2C 现在正在工作、并且不会在第一次尝试与 AFE 通信时停止。 现在、我的问题是、如果我运行程序来简单地检测从地址、它会为 AFE 输出3个地址、其中没有一个是固定的 AFE 从地址。

    进一步的实验导致了与上次相同的结果、这表明我销毁了 AFE。 我将生产更多的电路板以进行测试。  

    有人´m 我为什么会得到多个错误的地址? 我的下一个尝试是改变两条 I2C 线路上的上拉电阻器。

    Simon

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

    我不知道您的程序到底会做什么来检测 Salve 地址、但正如数据表中提到的、AFE4404的从器件地址为0x58。 I2C 总线中是否有其他从器件? 如果是、您能否移除其他从器件并重试。
    是的、您能否将 I2C 线路上的上拉电阻更改为10KOhm。

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

    Prabin、您好!

    这是 I2C 扫描仪 I´m 用于检测从地址的代码。 我从第一个帖子中提到的链接下载了它。  

    我的设置没有连接任何其他设备。  

    Simon

    // I2C 扫描仪
    //由 Nick Gammon 编写
    //日期:2011
    
    年4月20日#include 
    
    void setup(){
    Serial.begin (115200);
    
    // Leonardo:等待串行端口连接
    ,同时(!Serial)
    {
    }
    
    serial.println ();
    serial.println ("I2C 扫描器。 正在扫描...");
    字节计数= 0;
    
    Wire.begin();
    (字节 I = 8;I < 120;I++)
    {
    Wire.beginTransmission ㈠;
    serial.println(i);
    IF (Wire.endTransmission ()=0)
    {
    serial.print ("找到的地址:");
    serial.print (I、DEC);
    serial.print ("(0x");
    serial.print (i、十六进制);
    serial.println (")");
    count++;
    延迟(1);//可能不需要?
    } //良好响应结束
    }//循环结束
    Serial.println (“完成”);
    Serial.print (“找到”);
    Serial.print (count,DEC);
    Serial.printn (“设备”);
    } //设置结束
    
    void loop(){} 

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

    我不是 Arduino 领域的专家、但是您可以将"I2C 扫描仪"的第24行更改为

    IF (Wire.endTransmission (True)=0)

    此外、如果您只有一个从设备(AFE4404)、是否确实需要此扫描仪程序?

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

    Prabin、您好!

    您的对。 我不需要 I2C 扫描仪。 但是、由于我不知道 AFE 是否正常工作、因此我使用了扫描仪来查看它是否正确响应任何 I2C 通信。

    我很遗憾地说、该项目可能无法按时完成。 我刚刚收到了一个新的日期来创建一个新的传感器板、这只是几天前我需要提交我的文凭论文。  

    感谢你的帮助。

    Simon

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

    您可以执行以下检查以确定 AFE 是否响应 I2C 协议。
    1) 1)发送从器件地址并查找 ACK 信号(如果该信号为低电平、则表示 AFE 正在响应)。
    2) 2)测量 I2C_Write (0x23、0x1)前后的 INP/INM 引脚。 在写入之前、它应该为0.9V、在写入之后、它应该为~0。

    此致、
    Prabin