AD7616因为官方的例程不够, 可能在调试的时候碰到很多坑.
1. 首先保证AD7616的管脚正确配置成SPI驱动
2. 基本的SPI读写驱动, 注意1.官方的文档可能误导, 2.由于速度极快, 不需要loop延迟.
typedef union
{
int v32;
struct
{
short a16; //LSB
short b16; //MSB
};
}ADC7616READ;
int wr_ad7616(unsigned short cmd)
{
ADC7616READ adcRead;
u16 i;
AD_CS0;
AD_SCK1;
adcRead.v32 = 0;
i = 0x8000;
while(i)
{
if(cmd & i) //(1 << 15)
AD_DI1;
else
AD_DI0;
AD_SCK0;
if(isAD_DA) adcRead.a16 |= i;
if(isAD_DB) adcRead.b16 |= i;
i >>= 1;
AD_SCK1;
}
AD_CS1;
return adcRead.v32;
}
3. 初始化AD7616, 最好读出来看看正确与否
#define ADC_RD (0)
#define ADC_WR 0x8000 //(1<<15)
#define ADC_CHL_AB(a, b) (ADC_WR | (3 << 9) | ((b) << 4) | (a))
void init_ad7616(void)
{
AD_RST0;
vTaskDelay(5);
AD_RST1;
vTaskDelay(20); //15ms at least
AD_CON0;
AD_CS1;
wr_ad7616(ADC_WR | (2 << 9)| (7 << 2) | 0); //写 | 配置寄存器 128次过采样
vTaskDelay(1);
wr_ad7616(ADC_CHL_AB(0, 0)); //通道寄存器 B0 | A0
vTaskDelay(1);
wr_ad7616(ADC_WR | (4 << 9) | (0X55)); //ALL 2.5V 输入范围寄 存器A1
vTaskDelay(1);
wr_ad7616(ADC_WR | (5 << 9) | (0X55)); //ALL 2.5V
vTaskDelay(1);
wr_ad7616(ADC_WR | (6 << 9) | (0X55)); //ALL 2.5V
vTaskDelay(1);
wr_ad7616(ADC_WR | (7 << 9) | (0X55)); //ALL 2.5V
vTaskDelay(1);
readReg();
}
void readReg(void)
{
AD_CON1;
vTaskDelay(1);
AD_CON0;
int d = wr_ad7616(2 << 9);
printf("adc: %x \r\n", d);
vTaskDelay(1);
d = wr_ad7616(3 << 9);
printf("reg2: %hx \r\n", (u16)d);
vTaskDelay(1);
d = wr_ad7616(4 << 9);
printf("reg3: %hx \r\n", (u16)d);
vTaskDelay(1);
d = wr_ad7616(5 << 9);
printf("reg4: %hx \r\n", (u16)d);
vTaskDelay(1);
d = wr_ad7616(6 << 9);
printf("reg5: %hx \r\n", (u16)d);
vTaskDelay(1);
d = wr_ad7616(7 << 9);
printf("reg6: %hx \r\n", (u16)d);
vTaskDelay(1);
d = wr_ad7616(8 << 9);
printf("reg7: %hx \r\n", (u16)d);
}
开始转换, 注意, 要隔开两个写操作, 才能读出想要的通道的ad
bool startConvert(void)
{
AD_CON1;
AD_CS1;
delay_loop(1);
u16 i = 6000;
while(isAD_BUSY)
{
//taskYIELD();
if(--i == 0)
return false;
}
AD_CON0;
AD_CS0;
return true;
}
ADC7616READ adcRead[3];
void ad7616_conv(void)
{
startConvert();
adcRead[0].v32 = wr_ad7616(ADC_CHL_AB(0, 0)); //通道寄存器 B | A
printf("2: %hd %hd, ", adcRead[0].a16, adcRead[0].b16);
startConvert();
adcRead[0].v32 = wr_ad7616(ADC_CHL_AB(1, 1)); //通道寄存器 B | A
printf("11: %hx %hx, ", adcRead[0].a16, adcRead[0].b16);
startConvert();
adcRead[0].v32 = wr_ad7616(ADC_CHL_AB(2, 2)); //通道寄存器 B | A
printf("0: %hd %hd, ", adcRead[0].a16, adcRead[0].b16);
startConvert();
adcRead[0].v32 = wr_ad7616(ADC_CHL_AB(11, 11)); //通道寄存器 B | A
printf("1: %hd %hd", adcRead[0].a16, adcRead[0].b16);
printf("\r\n");
}