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.
大家好,
我正在使用 PGA460-Q1连接 Arduino - UNO。 I'hv 根据 TI 提供的数据表和软件开发指南准备了一个命令序列。 但是、我无法与 PGA460-Q1进行通信。
我尝试了以下方法:
在 PULSE_P1寄存器中、IO_IF_SEL 设置为0且 IO_DIS = 0。 UART 地址设置为0 (默认值)
CLK 引脚接地以启用 UART 模式
根据随附的流程图和软件代码传输了命令序列。 Arduino 传输的命令在存储示波器上读取并找到正确的命令。 但是、PGA460-Q1的 Tx 引脚没有响应。
如果命令序列/代码有任何问题/需要对代码进行进一步修改、您能提供反馈吗?
我想首先使用 UART 建立通信。 TCI 尚未使用。
注:-正在使用 EEPROM 出厂设置。
请尽快回复,提供有价值的信息!!!
谢谢和问候!!
Arduino 代码
//此代码取自 TI 网站上提供的软件开发指南。 进行了修改、以简化操作、无需使用与 EEPROM 相关的命令、因为会考虑 EEPROM 出厂默认值。
// P1和 P2阈值
#define P1_THR_0 0xB0
#define P1_THR_1 0x88
#define P1_THR_2 0x88
#define P1_THR_3 0x88
#define P1_THR_4 0x88
#define P1_THR_5 0x88
#define P1_THR_6 0xF9
#define P1_THR_7 0xCE
#define P1_THR_8 0x73
#define P1_THR_9 0x9C
#define P1_THR_10 0xE7
#define P1_THR_11 0x3F
#define P1_THR_12 0x3F
#define P1_THR_13 0x3F
#define P1_THR_14 0x3F
#define P1_THR_15 0x07
#define P2_THR_0 0xB0
#define P2_THR_1 0x88
#define P2_THR_2 0x88
#define P2_THR_3 0x88
#define P2_THR_4 0x88
#define P2_THR_5 0x88
#define P2_THR_6 0xF9
#define P2_THR_7 0xCE
#define P2_THR_8 0x73
#define P2_THR_9 0x9C
#define P2_THR_10 0xE7
#define P2_THR_11 0x3F
#define P2_THR_12 0x3F
#define P2_THR_13 0x3F
#define P2_THR_14 0x3F
#define P2_THR_15 0x07
#define synctyte 0x55 //同步字节
#define THRBW 0x80 //阈值批量写入命令
#define SRW 0x50 //串行写入命令
#define AFEGAINRANGE 0x0F // AFEGAINRANGE,保持范围 Ox0F
#define TVGBW 0x70 //阈值电压增益批量写入
#define TVGAIN0 0x88 // TVG 命令
#define TVGAIN1 0x88 // TVG 命令
#define TVGAIN2 0x88 // TVG 命令
#define TVGAIN3 0x41 //TVG 命令
#define TVGAIN4 0x04 //TVG 命令
#define TVGAIN5 0x10 //TVG 命令
#define TVGAIN6 0x40 //TVG 命令
#define P1BL 0x00 //预设和总线监听命令
#define numObj 0x01 //定义对象编号
//#define SD 0x40
#define UMR 0x28 //超声波测量命令
#define DECPL_TEMP 0x26
unsigned char calcChecksum (unsigned char);// calcchecksum 函数
用于保存值的无符号 char ChecksumInput[35];//校验和数组
unsigned char THBUFF[35];//针对 P1和 P2的阈值缓冲器数组
unsigned char AFEGAIN[5];//AFEGAIN 阵列
unsigned char cmd;//cmd 表示校验和函数中的命令
无符号字符 TVG[10];//阈值电压增益阵列
unsigned char pre1_BUR_LIS[4];//预设和突发监听数组
unsigned char Ultra_MEAS[3];//超声波测量阵列
unsigned char UMRData[35];//保存超声波测量数据 i:e 数据、宽度、振幅
无符号字符字节1;//表示对象距离字节1+字节2
unsigned char 字节2;
无符号字符字节3;//对象宽度测量
无符号字符字节4;//峰值幅度测量
void setup()
{
//将您的设置代码放在这里,运行一次:
Serial.begin(9600);//开始串行通信
//初始化数组的阈值
THBUFF[0]= syncByte;
THBUFF[1]=THRBW;
THBUFF[2]=P1_THR_0;
THBUFF[3]=P1_THR_1;
THBUFF[4]=P1_THR_2;
THBUFF[5]= P1_THR_3;
THBUFF[6]= P1_THR_4;
THBUFF[7]= P1_THR_5;
THBUFF[8]= P1_THR_6;
THBUFF[9]=P1_THR_7;
THBUFF[10]= P1_THR_8;
THBUFF[11]=P1_THR_9;
THBUFF[12]=P1_THR_10;
THBUFF[13]=P1_THR_11;
THBUFF[14]=P1_THR_12;
THBUFF[15]=P1_THR_13;
THBUFF[16]=P1_THR_14;
THBUFF[17]=P1_THR_15;
THBUFF[18]=P2_THR_0;
THBUFF[19]=P2_THR_1;
THBUFF[20]=P2_THR_2;
THBUFF[21]=P2_THR_3;
THBUFF[22]=P2_THR_4;
THBUFF[23]=P2_THR_5;
THBUFF[24]=P2_THR_6;
THBUFF[25]=P2_THR_7;
THBUFF[26]=P2_THR_8;
THBUFF[27]=P2_THR_9;
THBUFF[28]=P2_THR_10;
THBUFF[29]=P2_THR_11;
THBUFF[30]=P2_THR_12;
THBUFF[31]=P2_THR_13;
THBUFF[32]=P2_THR_14;
THBUFF[33]=P2_THR_15;
THBUFF[34]= calcChecksum (THRBW);
//初始化数组中的 AFEGAIN 值
AFEGAIN[0]= syncByte;
AFEGAIN[1]=SRW;
AFEGAIN[2]=DECPL_TEMP;
AFEGAIN[3]=AFEGAINRANGE;
AFEGAIN[4]=校验和(SRW);
//初始化数组中的 TVG 值
TVG[0]= syncByte;
TVG[1]=TVGBW;
TVG[2]= TVGAIN0;
TVG[3]= TVGAIN1;
TVG[4]= TVGAIN2;
TVG[5]= TVGAIN3;
TVG[6]= TVGAIN4;
TVG[7]= TVGAIN5;
TVG[8]= TVGAIN6;
TVG[9]= calcChecksum (TVGBW);
//发出 P1BL 以启动突发脉冲以测量实时飞行时间
PRE1_BUR_LIS[0]= syncByte;
PRE1_BUR_LIS[1]=P1BL;
pre1_BUR_LIS[2]=编号对象;
PRE1_BUR_LIS[3]=校验和(P1BL);
//超声波测量结果
Ultra_MEAS[0]= syncByte;
Ultra_MEAS[1]=UMR;
Ultra_MEAS[2]=校验和(UMR);
字节1=UMRData[0];//对象距离字节1+字节2.
字节2=UMRData[1];
字节3=UMRData[2];//对象宽度测量
字节4=UMRData[3];//峰值幅度测量
}
void loop(){
//延迟4秒
延迟(4000);
serial.write (THBUFF、35);//写入阈值批量写入
延迟(50);// 50mS 延迟
serial.write (AFEGAIN、5);//写入 AFEGAIN
延迟(50);// 50mS 延迟
serial.write (TVG、10);//写入 TVGAIN
延迟(50);// 50mS 延迟
//发出突发脉冲并连续读取 UMR 值
while (1U)
{
serial.write (pre1_BUR_LIS、4);//发出预设和突发监听
延迟(50);//延迟50mS
serial.write (Ultra_MEAS、3);//发出超声波测量
if (Serial.Available ()>0)//检查 Arduino UART 缓冲区中是否接收到数据
{
字节1 = Serial.read();//读取对象距离
字节2 = Serial.read();//读取对象距离
字节3 = Serial.Read();//读取对象宽度
字节4 = Serial.read();//读取对象峰值振幅
}
}
}
用于计算校验和的//函数
unsigned char calcChecksum (unsigned char cmd)
{
unsigned char checksumLoops =0;
unsigned char DataCount =0;
unsigned int carry = 0;
switch (cmd)
{
案例 P1BL://P1BL //预设1突发和监听- NUMOBJECT 为1校验和
ChecksumInput[0]= cmd;
ChecksumInput[1]= numObj;
校验和循环= 2;
中断;
Case UMR://UMR //超声波测量结果校验和
//case 2://SD //系统诊断
ChecksumInput[0]= cmd;
校验和循环= 1;
中断;
案例 SRW://rw //寄存器写入校验和
ChecksumInput[0]= cmd;
ChecksumInput [1]= DECPL_TEMP;//0x26
ChecksumInput [2]= AFEGAINRANGE;//GAIN_RANGE=0x0F
校验和循环= 3;
中断;
案例 TVGBW://TVGBW //时变增益批量写入校验和
ChecksumInput[0]= cmd;
ChecksumInput [1]= TVGAIN0;
ChecksumInput [2]= TVGAIN1;
ChecksumInput [3]= TVGAIN2;
ChecksumInput [4]= TVGAIN3;
ChecksumInput [5]= TVGAIN4;
ChecksumInput [6]= TVGAIN5;
ChecksumInput [7]= TVGAIN6;
校验和循环= 8;
中断;
案例 THRBW://THRBW //阈值批量写入校验和
ChecksumInput[0]= cmd;
ChecksumInput [1]= P1_THR_0;
ChecksumInput [2]= P1_THR_1;
ChecksumInput [3]= P1_THR_2;
ChecksumInput [4]= P1_THR_3;
ChecksumInput [5]= P1_THR_4;
ChecksumInput [6]= P1_THR_5;
ChecksumInput [7]= P1_THR_6;
ChecksumInput [8]= P1_THR_7;
ChecksumInput [9]= P1_THR_8;
ChecksumInput [10]= P1_THR_9;
ChecksumInput [11]= P1_THR_10;
ChecksumInput [12]= P1_THR_11;
ChecksumInput [13]= P1_THR_12;
ChecksumInput [14]= P1_THR_13;
ChecksumInput [15]= P1_THR_14;
ChecksumInput [16]= P1_THR_15;
ChecksumInput [17]= P2_THR_0;
ChecksumInput [18]= P2_THR_1;
ChecksumInput [19]= P2_THR_2;
ChecksumInput [20]= P2_THR_3;
ChecksumInput [21]= P2_THR_4;
ChecksumInput [22]= P2_THR_5;
ChecksumInput [23]= P2_THR_6;
ChecksumInput [24]= P2_THR_7;
ChecksumInput [25]= P2_THR_8;
ChecksumInput [26]= P2_THR_9;
ChecksumInput [27]= P2_THR_10;
ChecksumInput [28]= P2_THR_11;
ChecksumInput [29]= P2_THR_12;
ChecksumInput[30]= P2_THR_13;
ChecksumInput [31]= P2_THR_14;
ChecksumInput[32]= P2_THR_15;
ChecksumLoops = 33;
中断;
默认值:
中断;
}
进位= 0;
对于(DataCount = 0;DataCount < checksumLoops;DataCount++)
{
如果((ChecksumInput[DataCount]+进位)<进位)
{
进位=进位+ ChecksumInput[DataCount]+ 1;
}
其他
{
进位=进位+ ChecksumInput[DataCount];
}
如果(进位> 0xFF)
{
进位=进位- 255;
}
}
进位=(~进位& 0x00FF);
回车;
}