AD7616 IO模拟SPI驱动大法

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");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值