大家好!我最近在着手使用DSP来控制AD7768-1进行电压采样,但是遇到了问题,还请大家指点一二。我根据芯片手册上的内容,给寄存器0x14、0x15、0x18、0x19分别配置相对应的内容,另外,配置了寄存器0x1D,给GPIO3发送一个1us左右的低电平,使其通过SYNC_OUT向SYNC_IN发送一个低电平来更新上述寄存器的值,但是DRDY输出的频率没有发生改变,仍然是15KHz左右。以下是我使用的代码,SPI是用GPIO口模拟的,时序的话,我用示波器抓取显示,没问题。
//写入寄存器0x14,无CRC,24位
addr = 0x14;
data = 0x05;
WriteToAD7768RViaSpi(&addr, &data);
delay(50);
//写入寄存器0x15,晶振、低速16分频
addr = 0x15;
data = 0x44;//01_00_0_1_00
WriteToAD7768RViaSpi(&addr, &data);
delay(50);
//写入寄存器0x19,sinc5滤波、x256
addr = 0x19;
data = 0x83;
WriteToAD7768RViaSpi(&addr, &data);
delay(50);
addr = 0x18;
data = 0x90;
WriteToAD7768RViaSpi(&addr, &data);
delay(50);
addr = 0x1D;
data = 0x48;//0_1_00_1_0_00
WriteToAD7768RViaSpi(&addr, &data);
delay(50);
以下的代码是判断出DRDY的上升沿后,flag = 0,然后给GPIO3(STARTn)输出一个低电平,用来更新寄存器的值,这部分参考的是数据手册上 Initializing the Recommended Interface 这部分内容
if (flag == 0){
GPIOPinWrite(SOC_GPIO_0_REGS, 14, GPIO_PIN_LOW);
delay(50);
GPIOPinWrite(SOC_GPIO_0_REGS, 14, GPIO_PIN_HIGH);
delay(1);
break;
}
else{
continue;
}
下面是我所使用的模拟SPI代码
void WriteToAD7768RViaSpi(int *address, int *data){
SET_SYNC();//CS拉高
delay(5);
CLR_SYNC();//CS拉低
delay_us(5);
SPIWrite(address, data);//写数据
delay_us(5);
SET_SYNC();//CS拉高,一次写结束
}
void SPIWrite(int *address, int *data){
int ValueToWrite[2];
unsigned int i = 0;
unsigned int j = 0;
ValueToWrite[0] = (*address) & 0x3f;//取寄存器地址
ValueToWrite[1] = (*data) & 0xff;//取寄存器值
for(i = 0; i < 2; i++){
for (j = 0; j < 8; j++){
CLR_SCLK();//SCK拉低
if(0x80 == (ValueToWrite[i] & 0x80)){
SET_SDIN(); //Send one to SDI pin,如果当前位为1,SDI输出1
}
else{
CLR_SDIN(); //Send zero to SDI pin
}
delay(1);
SET_SCLK();//SCK拉高
delay(1);
ValueToWrite[i] <<= 1; //Rotate data
}
}
}