MCP4822模数转换芯片驱动
MCP4822DA转换芯片
驱动原理
SPI协议
根据手册来看最小有效时间为:15us-100us 没有最大有效时间规定,所以可以直接都给到100us以上的延时
设置位:15:通道选择 14:无效位 13:电压增益 12:输出控制
数据位:11-0位,共12位。所以最大值为4095
源码
平台:stm32f103c8t6
mcp4822.c
#include "mcp4822.h"
#include "delay.h"
//CS
#define MCP4822_CS_PORT GPIOB
#define MCP4822_CS_PIN GPIO_Pin_9
//SCK
#define MCP4822_SCK_PORT GPIOB
#define MCP4822_SCK_PIN GPIO_Pin_6
//SDI
#define MCP4822_SDI_PORT GPIOB
#define MCP4822_SDI_PIN GPIO_Pin_5
//LDAC
#define MCP4822_LDAC_PORT GPIOB
#define MCP4822_LDAC_PIN GPIO_Pin_7
#define CS PBout(9)
#define SCK PBout(6)
#define SDI PBout(5)
#define LDAC PBout(7)
//初始化函数
void MCP4822_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = MCP4822_CS_PIN|MCP4822_SCK_PIN|MCP4822_SDI_PIN|MCP4822_LDAC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/****************************************************
ch:通道 gate:电压增益 shdn:开关(0:关 1:开) dat:数据(0-4095)
****************************************************/
void MCP4822_WriteValue(uchar ch,uchar gate,uchar shdn,uint dat) // 1 0 1 2000
{
uchar i;
uchar dat_h=0;
dat_h= ch <<7; //位15
dat_h|=gate<<5; //位13
dat_h|=shdn<<4; //位12
dat&=0x0fff;
dat|=(uint) dat_h<<8;
LDAC=0;
CS =1;
delay_ms(1);
CS =0;
delay_ms(1);
for(i=16;i>0;i--)
{
SCK = 0;
if(dat&0x8000) SDI=1;
else SDI=0;
delay_us(100);
SCK = 1;
delay_us(110);
SCK = 0;
dat <<= 1;
}
CS = 1;
delay_ms(1);
}
mcp4822.h
#ifndef __MCP4822_H__
#define __MCP4822_H__
#include "sys.h"
#define uchar unsigned char
#define uint unsigned int
void MCP4822_Init(void);
void MCP4822_WriteValue(uchar ch,uchar gate,uchar shdn,uint dat);
#endif