ADC(二)—MCP3202

1.器件介绍

mcp3202是Microchip(微芯科技)公司产的一款ADC芯片,成本低,使用方便。本文主要分析软件使用方面的特点及方法。

1.1器件特点

1)转换精度:12bit

2)转换速率:100ksps(最快)

3)伪差分输入

4)4线spi控制接口

5)使用简单,无须复杂的寄存器配置,直接通过spi获取转换数据

1.2应用范围

1)传感器

2)过程控制

3)数据采集

4)电池供电系统

1.3器件基础框图

2.器件使用(软件)

2.1时序图

驱动mcp3202,主要是实现一个spi总线,首先看改器件时序图,如下。

时序图分析:

1)片选线、时钟线与普通spi一致;

2)数据输入(SDI):第一位为启动位,固定为1,第2、3位为配置选择位,具体选择信息如下;第4位MSBF,设置数据格式,高位/低位在前,一般情况下我们都使用“高位在前”的模式;后面的数据则为无关位;

3)数据输出(SDO):从第6个时钟周期开始,返回的数据为有效数据,共12位,高位在前。

2.2器件使用

1)对应这类非标spi,可以通过模拟时序实现;

2)通过硬件spi实现,其中此器件手册也有专门介绍如何通过硬件spi驱动(其他像ADI的器件就很少有说明),如图。

a)读一个完整的12bit数据至少需要17个时钟周期,故意以8bit模式的spi下,最少需要24个时钟周期(3字节);

b)根据返回数据有效位,通过“移位”和“按位与”的方式提取有效数据。

2.3驱动代码

以stm32f1为例,以“spi抽象/硬件spi”中的spi封装代码为基础,驱动mcp3202。

 

#include "spi_core.h"
#include "spi_hw.h"

static struct spi_dev_device mcp3202_spi_dev;
static struct spi_bus_device spi_bus0;

static void spi0_cs(unsigned char state)
{
     if (state)
          GPIO_SetBits(GPIOC, GPIO_Pin_4);
     else
          GPIO_ResetBits(GPIOC, GPIO_Pin_4);
}

void mcp3202_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//spi cs
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_SetBits(GPIOC, GPIO_Pin_4);	
	
	//device init
	stm32f1xx_spi_init(&spi_bus0,8,0,0);
	mcp3202_spi_dev.spi_cs 	= spi0_cs;
	mcp3202_spi_dev.spi_bus = &spi_bus0;			
}

u16  mcp3202_read(u8 mode)
{
	u8 send_buff[3],recv_buff[3];
	
	send_buff[0] = 0x01;
	send_buff[1] = mode;
	send_buff[2] = 0x00;
	spi_send_recv(&mcp3202_spi_dev,send_buff,recv_buff,3);
	
	return (((recv_buff[1] << 8) | recv_buff[2])&0x0fff);
}

代码简要分析:

 

1)stm32f1代码配置查看附件源码,配置参数与前面使用的一致,对于其他spi器件也是,几乎无须更改,注意速率和模式即可;

2)片选初始化;

3)用到的spi封装接口是“spi_send_recv”,通过器件时序图即可看出;

4)send_buff:第一字节0x01是启动位,第二字节mode为模式,第三字节为无关位,设置为0即可;

5)recv_buff:接收返回数据,并提取有效的12位数据。

3.参考源码

[1]  https://github.com/Prry/drivers-for-mcu

 

posted @ 2018-01-23 10:32  Acuity  阅读(410)  评论(0)    收藏  举报