OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10986|回复: 6

有谁用过DA转换芯片MCP4822的

[复制链接]

30

主题

158

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1525
金钱
1525
注册时间
2015-11-11
在线时间
163 小时
发表于 2016-1-20 16:33:05 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 wcyingdream 于 2016-1-20 16:43 编辑

有没有人用过MCP4822的,我用spi模式和普通引脚模式怎么都驱动不起来,SPI模式配置的是两线全双工,8位数据,高电平有效,第二个时钟沿采样。
有用过的没,讨论讨论。手册上说芯片SPI接口支持20MHz时钟,是指最大支持20MHz吗

最佳答案

查看完整内容[请看2#楼]

好了,搞定了,可以正常工作了,以下是代码。 #define _nop_() delay() static void delay(void) { u16 i = 0x0f; while(i--); } //函数:设置MCP4822的输出值,有效值为0-4095 //ch---0:通道A;1:通道B //gate---0:2倍增益;1:不增益 //shdn---0:关段;1:工作 //data---设置值 void MCP4822_WriteValue(u8 ch,u8 gate,u8 shdn,uint16_t dat) { u8 i; u8 dat_h=0; dat_h= ch
好好学习
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

158

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1525
金钱
1525
注册时间
2015-11-11
在线时间
163 小时
 楼主| 发表于 2016-1-20 16:33:06 | 显示全部楼层
好了,搞定了,可以正常工作了,以下是代码。

#define _nop_()  delay()

static void delay(void)
{
        u16 i = 0x0f;
        while(i--);
}

//函数:设置MCP4822的输出值,有效值为0-4095
//ch---0:通道A;1:通道B
//gate---0:2倍增益;1:不增益
//shdn---0:关段;1:工作
//data---设置值
void MCP4822_WriteValue(u8 ch,u8 gate,u8 shdn,uint16_t dat)               
{
        u8 i;
        u8 dat_h=0;
        dat_h= ch<<7;                        //位15
        dat_h|=gate<<5;                //位13
        dat_h|=shdn<<4;                //位12
        dat&=0x0fff;
        dat|=(uint16_t) dat_h<<8;
       
        MCP_CS=1;
        _nop_();
        MCP_CS = 0;
        _nop_();         //   
        MCP_SCK = 0;
        _nop_();
       
        for(i=16;i>0;i--)
        {
                if(dat&0x8000)
                        MCP_SDI=1;
                else
                        MCP_SDI=0;
                _nop_();
                dat <<= 1;
                MCP_SCK = 1;
                _nop_();
                MCP_SCK = 0;
                _nop_();
        }
         
        MCP_CS = 1;
        _nop_();
}

好好学习
回复

使用道具 举报

4

主题

102

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2013-8-28
在线时间
114 小时
发表于 2016-8-15 23:05:02 | 显示全部楼层
谢谢分享,刚准备用这块片子,不知道稳定性如何?
回复

使用道具 举报

30

主题

158

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1525
金钱
1525
注册时间
2015-11-11
在线时间
163 小时
 楼主| 发表于 2016-8-16 10:11:25 | 显示全部楼层
geo 发表于 2016-8-15 23:05
谢谢分享,刚准备用这块片子,不知道稳定性如何?

稳定性就不清楚了,没有长期测试
好好学习
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2018-3-28
在线时间
30 小时
发表于 2020-3-10 12:19:09 | 显示全部楼层
wcyingdream 发表于 2016-8-16 10:11
稳定性就不清楚了,没有长期测试

你好,请问MCP4822性能图如何,可否同时输出A\B通道,可否将LDAC引脚直接接地?
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2022-3-14
在线时间
12 小时
发表于 2023-1-13 11:09:52 | 显示全部楼层
fight281 发表于 2020-3-10 12:19
你好,请问MCP4822性能图如何,可否同时输出A\B通道,可否将LDAC引脚直接接地?

可以同时输出AB两通道的;LDAC可以接地,省下一个引脚
回复

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-1-7
在线时间
39 小时
发表于 2023-1-14 08:32:50 | 显示全部楼层
SPI模式的芯片,用过,还行,以下是代码,拿走不谢谢


#include "Spi.h"

/********************************************************************
  * 函数说明:初始化STM32外设,GPIO,时钟
  * 输    入:无
  * 返    回:无
  ******************************************************************/
void MCP4822_SPI_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef SPI_InitStructure;
       
        /* 使用的外设时钟使能 -------------------------------------------*/
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
        /* 配置驱动板引脚 --------------------------------------------*/

        /* 配置SPI_SCK------------------------------------------------*/
        GPIO_InitStructure.GPIO_Pin = SPI_SCK_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(SPI_SCK_Port, &GPIO_InitStructure);
        /* 配置SPI_MOSI----------------------------------------------*/
        GPIO_InitStructure.GPIO_Pin = SPI_MOSI_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(SPI_MOSI_Port, &GPIO_InitStructure);
       
        /* 配置SPI_MISO -------------------------------------------------*/
        GPIO_InitStructure.GPIO_Pin = SPI_MISO_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(SPI_MISO_Port, &GPIO_InitStructure);
       
        /* 配置SPI_NSS(片选1)-----------------------------------------*/
        GPIO_InitStructure.GPIO_Pin = SPI_NSS_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(SPI_NSS_Port, &GPIO_InitStructure);
        MCP4822_NSS_OFF();
       
        /* LDAC-----------------------------------------*/
        GPIO_InitStructure.GPIO_Pin = LDAC_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(LDAC_Port, &GPIO_InitStructure);
        GPIO_ResetBits(LDAC_Port, LDAC_Pin);

        /* 配置 SPI ------------------------------------------------------*/
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
       
        SPI_Init(MCP4822_SPI, &SPI_InitStructure);
        /* 使能 SPI */
        SPI_Cmd(MCP4822_SPI, ENABLE);
}

/********************************************************************
  * 函数说明:发送/接收一个字节到SPI
  * 输    入:发送字节
  * 返    回:接收字节
  ******************************************************************/
uint8_t MCP4822_Send_Byte(uint8_t byte)
{
//  FM_NSS_ON();
        /* 等待数据寄存器空 */
    while(SPI_I2S_GetFlagStatus(MCP4822_SPI, SPI_I2S_FLAG_TXE) == RESET);

    /* 通过SPI2接口发送数据 */
    SPI_I2S_SendData(MCP4822_SPI, byte);

    /* 等待接收到一个字节的数据 */
    while(SPI_I2S_GetFlagStatus(MCP4822_SPI, SPI_I2S_FLAG_RXNE) == RESET);

//        FM_NSS_OFF();
    /* 返回接收的数据 */
    return SPI_I2S_ReceiveData(MCP4822_SPI);
}

uint16_t MCP4822_Send_HalfWord(uint16 HalfWord)
{
//  FM_NSS_ON();
        /* 等待数据寄存器空 */
    while(SPI_I2S_GetFlagStatus(MCP4822_SPI, SPI_I2S_FLAG_TXE) == RESET);

    /* 通过SPI2接口发送数据 */
    SPI_I2S_SendData(MCP4822_SPI, HalfWord);

    /* 等待接收到一个字节的数据 */
    while(SPI_I2S_GetFlagStatus(MCP4822_SPI, SPI_I2S_FLAG_RXNE) == RESET);

//        FM_NSS_OFF();
    /* 返回接收的数据 */
    return SPI_I2S_ReceiveData(MCP4822_SPI);
}

/*
bit 15 A/B: DAC A or DAC B Selection bit
1 = Write to DAC B
0 = Write to DAC A
bit 14 — Don’t Care
bit 13 GA: Output Gain Selection bit
1 = 1x (V OUT = V REF * D/4096)
0 = 2x (V OUT = 2 * V REF * D/4096), where internal V REF = 2.048V.
bit 12 SHDN: Output Shutdown Control bit
1 = Active mode operation. V OUT is available. ?
0 = Shutdown the selected DAC channel. Analog output is not available at the channel that was shut down.
V OUT pin is connected to 500 k???typical)?
bit 11-0 D110: DAC Input Data bits. Bit x is ignored
*/
//通道和mV
void MCP4822_SetVoltage(uint8_t Index,uint16_t mVol)
{
        uint16_t mDta = mVol;
        //uint16_t m_value = mVol;//mVol/4.096*4095;
        //mDta = mVol;
        GPIO_SetBits(LDAC_Port, LDAC_Pin);
       
        mDta &= 0x0FFF;                        //bit13=0则最大输出电压为4096mV
       
        if(Index == 1)                       
        {
                mDta |= 0x8000;                //通道1输出
        }
        mDta |= 0x1000;                        //打开输出
       
        MCP4822_NSS_ON();
        MCP4822_Send_HalfWord(mDta);
        MCP4822_NSS_OFF();
       
        GPIO_ResetBits(LDAC_Port, LDAC_Pin);
        __NOP();__NOP();
        GPIO_SetBits(LDAC_Port, LDAC_Pin);
}





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表