我尝试使用 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);
}