我正在尝试使用 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 读数及其环境值、并通过串行方式将其发送到计算机。 是我用于该目的的代码。
请提供帮助、谢谢