MCP4922

本贴最后更新于 518 天前,其中的信息可能已经水流花落
  • MCP4922 :12 位双通道 DAC

时序

  ​imageimage​​image​​​​

引脚

  ​image

  ​image

  ‍

电压输出

  ​image

  ​image

  ​image

寄存器

  ​image

  ​image

程序

#include "MCP4922.H"

//========================================================================
// 描述: SPI初始化.
// 参数: none.
// 返回: none.
//========================================================================
void MCP4922_init()
{
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义

	GPIO_InitStructure.Pin  = GPIO_Pin_0|GPIO_Pin_1 |GPIO_Pin_2|GPIO_Pin_3  ;		//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);	//初始化

//    SOFTSPI_SCK_MODE;
//    SOFTSPI_MISO_MODE;
//    SOFTSPI_MOSI_MODE;
	MCP4922_CS = 1;
	MCP4922_LD = 1;
    SOFTSPI_SCK_PIN = 0;        //set clock to low initial state
}

//========================================================================
// 描述: SPI写入一个字节后读取一个字节数据.
// 参数: none.
// 返回: none.
//========================================================================
u8 softspi_wr_data(u16 dat)
{
    u16 datavalue=0,i,wr_data;
    wr_data = dat;

    #if SOFTSPI_CPHA==0 && SOFTSPI_CPOL==0
    for(i=0;i<16;i++){
        if(wr_data&0x8000){
            SOFTSPI_MOSI_PIN = 1;
        }else{
            SOFTSPI_MOSI_PIN = 0;
        }
        wr_data <<=1;
        SOFTSPI_SCK_PIN = 1;
        datavalue <<=1;
        if(SOFTSPI_MISO_PIN == 1){
            datavalue |= 0x01;
        }
         SOFTSPI_SCK_PIN = 0;
        //delay(1);
    }
  
    #elif SOFTSPI_CPHA==0 && SOFTSPI_CPOL==1
    for(i=0;i<16;i++){
        if(wr_data&0x8000){
            SOFTSPI_MOSI_PIN = 1;
        }else{
            SOFTSPI_MOSI_PIN = 0;
        }
        wr_data <<=1;
        SOFTSPI_SCK_PIN = 0;
        datavalue <<=1;
        if(SOFTSPI_MISO_PIN == 1){
            datavalue |= 0x01;
        }
        SOFTSPI_SCK_PIN = 1;
        //delay(1);
    }  
  
    #elif SOFTSPI_CPHA==1 && SOFTSPI_CPOL==0
    for(i=0;i<16;i++){
        SOFTSPI_SCK_PIN = 1;
        if(wr_data&0x8000){
            SOFTSPI_MOSI_PIN = 1;
        }else{
            SOFTSPI_MOSI_PIN = 0;
        }
        wr_data <<=1;
        SOFTSPI_SCK_PIN = 0;
        datavalue <<=1;
        if(SOFTSPI_MISO_PIN == 1){
            datavalue |= 0x01;
        }
        //delay(1);
    } 
  
    #elif SOFTSPI_CPHA==1 && SOFTSPI_CPOL==1
    for(i=0;i<16;i++){
        SOFTSPI_SCK_PIN = 0;
        if(wr_data&0x80){
            SOFTSPI_MOSI_PIN = 1;
        }else{
             SOFTSPI_MOSI_PIN = 0;
        }
        wr_data <<=1;
        SOFTSPI_SCK_PIN = 1;
        datavalue <<=1;
        if(SOFTSPI_MISO_PIN == 1){
            datavalue |= 0x01;
        }
        SOFTSPI_SCK_PIN = 1;
        // delay(1);
    } 
    #endif
    return datavalue;
}

//========================================================================
// 描述: SPI写一个字节.
// 参数: none.
// 返回: none.
//========================================================================
void softspi_write_byte(u8 out)
{
    softspi_wr_data(out);
}

//========================================================================
// 描述: SPI读一个字节.
// 参数: none.
// 返回: none.
//========================================================================
u8 softspi_read_byte(void)
{
    return softspi_wr_data(0xff);;
}

#define  MCP4922_VREF 3.3

void MCP4922_SET(u8 channel,u8 gain,float dac_out)
{
	u16 dat = 0x1000;	//打开输出
	u16 d_dat=0;

	if(channel == 1)		//选择DACB
		dat |= 0x8000;

	if(gain == 1)			//默认2x
	{
		dat |= 0x2000;
		d_dat = dac_out / MCP4922_VREF * 4096;
	}
	else
	{
		d_dat = dac_out / MCP4922_VREF * 4096 / 2;
	}
	//d_dat = 4095-50;

	dat |= d_dat;

	MCP4922_CS = 0;
	MCP4922_LD = 1;
	softspi_wr_data(dat);
	MCP4922_LD = 0;
	MCP4922_CS = 1; 
}
#ifndef __MCP4922_H_
#define __MCP4922_H_


#include	"config.h"
#include	"STC8A_Delay.h"
#include	"STC8A_GPIO.h"

sbit MCP4922_CS =	 P2^3;
sbit MCP4922_SCLK =	 P2^2;
sbit MCP4922_SDI = 	P2^1;
sbit MCP4922_LD = 	P2^0;

#ifndef   SOFTSPI_SCK_PIN
#define   SOFTSPI_SCK_PIN       P22
#endif

#ifndef   SOFTSPI_MISO_PIN
#define   SOFTSPI_MISO_PIN       P21
#endif

#ifndef   SOFTSPI_MOSI_PIN
#define   SOFTSPI_MOSI_PIN       P21
#endif

#define SOFTSPI_CPHA 0
#define SOFTSPI_CPOL 0

void MCP4922_init();//初始化
u8 softspi_wr_data(u16 dat);
//void softspi_write_byte(u8 out);
//u8 softspi_read_byte(void);
void MCP4922_SET(u8 channel,u8 gain,float dac_out);


#endif

void main(void)
{
    GPIO_config();
    UART_config();
    Hmi_Init();
    MCP4922_init();
    EA = 1;

    while(1)
    {
        instructionProcessing();
	MCP4922_SET(0,1,3.2);
	MCP4922_SET(1,1,1.0);
    }
}

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...