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:带 Arduino Mega2560的 AFE4404

Guru**** 2390735 points
Other Parts Discussed in Thread: AFE4404

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/810614/afe4404-afe4404-with-arduino-mega2560

器件型号:AFE4404

我正在尝试使用 Arduino Mega 2560对 AFE4404的操作进行编程和控制:

到目前为止、这是代码:

#include 
#include "heart_3.h"
#include "heart_3_hal.h"
#include "heart_3_hw.h"




/* Pinbelegung */

int RESETZ = 18;

/* Variableendeklel *

/ float befehl = 0;
int AFE_ADDR = 88;


/* AFE440X 寄存

器#define AFE0/* controlAFE440X 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


volatile int allow = 0;
long LD1 = 0、LD2 = 0、LD3 = 0、amb1 = 0、amb2 = 0;



void setup(){
//将您的设置代码放在此处,运行一次:
//AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE
Serial.begin(19200);
Wire.begin();
pinMode (RESETZ、OUTPUT);
AFE_RESETZ_Init ();
AFE_Trigger_HWReset ();
AFE_Init ();
//AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE AFE

// Mega 配置:需要 I2C、CLK 配置、PIN 配置
// I/O 端口配置(0用于输入,1用于输出)
DDRD &= 0b11111011;DDRD |= 0b00001000; //引脚 PC3输出用于复位 AFE4404,引脚 PC2是来自 afe4404 ADC Ready int
PORTD &= 0b111110的输入; PC3的//上拉电阻器处于关闭状态,因为 ADC 就绪为高电平有效
。Pind |= 0b00000010;//将引脚 PC3输出设置为1,因为 AFE4404复位为低电平有效


。//
通用配置
MCUCR |=(3 <<ISC00); //上升沿
GICR |=(1 << INT2); //在 INT0
SREG |=(1 <<7)上启用中断; //全局中断启用
*/

attachInterrupt (digitalPinToInterrupt (19),RD_SIGNAL,上升);//启用 INT2

/*
PRR0 =; //功率降低寄存器
PRR1 =;
*/

//微控制器内部时钟配置
// clk = 8MHz,与 AFE4404外部时钟选项兼容,后者是默认的兆2560 MCU /*//I2C/TWI

配置
//引脚: 当
SCL 线路为高电平时、SDA=PD1 (44)、SCL=PD0 (43)//开始和停止条件通过改变 SDA 线路的电平来发出信号。
// TWI 总线上传输的所有地址数据包长度为9位,包括7个地址位、1个读/写控制位和1个确认位。
//首先发送地址字节的 MSB。
//0000 000为通用调用地址保留、用于使所有从器件响应
//READ/WRITE 位置位、执行读取操作
//7b 地址+ 1b R/W + ACK...note、确认 ACK 是在第九个 SCL (ACK)周期将 SDA 拉低的从器件。
//在数据传输期间,在 TWI 总线上传输的所有数据包长度为9位,包含一个数据字节和一个确认位
,//主器件生成时钟以及开始和停止条件,而接收器负责确认接收。
//如果接收器将 SDA 线路保持为高电平、则发出 NACK (无 ACK)信号。
//1// TWI of C10iion //1//1/TWBR
= 0:00;// TWI 比特率寄存器-->频率= FSYS/16
TWSR
TWDR //TWI 数据和地址 shif 寄存器

TWCR |= 0b00000001; //启用 TWI 中断,读取/写入 TWI 寄存器后清除标志,以允许下次启动(由 TWCR 清除|= 0b10000000)
TWCR |= 0b01000000; //启用 ACK 位,否则 TWI 可被视为已断开连接。
//TWCR |= 0b00100000; //使用此选项启动启动启动条件,然后必须将其清除为每个传输周期
//TWCR |= 0b00010000; //这是启动停止
// TWCR3是一个冲突标志,如果 TWI 忙(即 TWINT = 0意味着忙),则该标志会升高
TWCR |= 0b00000100; //启用 TWI
//TWCR7是 TWINT 或 TWI 中断标志、在 TWI 模块完成时发出、通过将其设置为1来清除

(B7:3是 TWI 模块状态+ B1:0表示预分频器)
//TWAR = 0h10110000 (B7:1 = 0h58 > TWI 地址= 1)、启用总调用识别寄存器
//Check page 345了解有关 TWI 操作的更多详细信息
*/

}


void Rd_signal (){
allow = 1;
}




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

if (allow = 1){
//语句
允许= 0;
LD1 = hr3_get_LED1_val ();
Serial.print (LD1);
Serial.print (hr3_get_LED2_val ()));
Serial.print (hr3_get_LED3_val ()));Serial.print (hr3_get_LED3_val ());
serial.print (hr3_get_amb1_val ());
serial.print (hr3_get_LED2_amb2_val ());
serial.print (hr3_get_LED1_amb1_val ());

//读取数据并将其传输到计算机

}

}



//********* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////// 函数解函数////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //




/ //*
奥斯勒森德斯特列伦·艾根贝利斯特 */
********* /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);
} 

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

问题是::

当我使用 Arduino 编译器进行编译时、我会遇到以下错误:

Arduino:1.8.9 (Windows 10)、板:"Arduino/Genuino Mega 或 Mega 2560、ATMega 2560 (Mega 2560)"

C:\Users\Adeel\AppData\Local\Temp\ccpN2Ab.ltrans0.ltrans.o:在函数`main'中:

:(.text.startup+0x394):未定义对`hr3_get_LED1_val ()'的引用

:(.text.startup+0x39a):未定义对`hr3_get_LED2_val ()'的引用

:(.text.startup+0x3a2):未定义对`hr3_get_LED3_val ()'的引用

:(.text.startup+0x3aa):未定义对`hr3_get_amb1_val ()'的引用

:(.text.startup+0x3b2):未定义对`hr3_get_LED2_amb2_val ()'的引用

:(.text.startup+0x3ba):未定义对`hr3_get_LED1_amb1_val ()'的引用

collect2.exe:错误:LD 返回1退出状态

退出状态1
编译电路板 Arduino/Genuino Mega 或 Mega 2560时出错。

本报告将提供更多信息
"编译期间显示详细输出"
在文件->首选项中启用选项。

我尝试手动将#include 添加到.c 和.h 文件中、耳戴 ATE_3、 耳戴 ATE_3_hal 和 耳戴 ATE_3_HW、但仍然会出现相同的错误。

最后、我只想读取 SFH7050 3-LED 读数及其环境值、并通过串行方式将其发送到计算机。 是我用于该目的的代码。

请提供帮助、谢谢

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

    你好,Hazem。

    此错误与 Arduino 有关。 您可以在线搜索如何从 Arduino 中的其他文件调用模块。 由于我们不是 Arduino 编程专家、因此我们的帮助将受到限制。  

    如果您对读取数据感兴趣,则可以使用 AFE_Reg_Read()函数读取 AFE 的输出。 您可以从0x2A 到0x2D 寄存器读取输出。

    此致、

    Prabin。

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

    您好、Parbin、

    感谢您的回复。。 对于模块调用错误,我设法解决了它,但现在的问题是:

    在初始化 AFE4404之后,我设置 INT2 (MEGA2560)以响应 ADC_RDY (AFE4404) int,但从未发生中断,并且任何读取函数(AFE_Reg_Read()或 HR3读取函数)返回0。

    我已确保 MEGA2560中断正常工作、所有连接正确、AFE4404模块 SFH7050传感器未损坏、手指在传感器上、但仍然只能获得零读数。

    您认为问题可能是什么?

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

    您好 Hazem、

    以下可能是问题的原因。

    1) 1)寄存器设置不正确。 为了排除这种原因、我建议您尝试数据表表表表表11中给出的采样寄存器设置。

    2) 2) AFE 没有外部时钟。 若要排除这种情况、请将 AFE 编程到内部振荡器模式并检查 ADC_RDY。

    此致、

    Prabin

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

    我下载了 TI AFE4404 EVM 软件、它允许在 GUI 中设置所有参数、然后我可以在验证后保存所有寄存器值...我已尝试表11...in 中的值所有情况下、结果都是相同的。

    我应用了一个8MHz 时钟,确保为外部振荡器设置控制寄存器... 还尝试了不同的 Vpp 值(针对时钟信号0:4和0:5V)。 仍然没有结果

    我注意 到的唯一奇怪行为是、当我用1填充 AFE4404_control0中的读取使能位时、有时会强制 Arduino 重置 MCU 代码。 我最终工作正常,可能会从电路板汲取大量电流,因此我提供了 Arduino 和 AFE,它们来自不同的电源(使用公共接地),但 MCU 代码仍然保持复位。 当我尝试在 void loop()之前读取 void setup()中的寄存器值时,会发生这种情况,