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