查看: 1498|回复: 0
打印 上一主题 下一主题

用STM32F103xx的SPI与DAC7612通信的注意地方

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-13 23:30:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于DAC7612,此IC是TI的12bit数模转换芯片,具体手册可百度查阅;

在用STM32的spi接口与7612通信时:

注意1:
7612的SPI时钟极性CPOL为高电平
7612的SPI时钟相位CPHA为第2个时钟沿进行采样

stm32 spi设置如下:
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;         //时钟悬空gao
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       //CPHA=1 数据捕获于第2个时钟沿

注意2:
由于7612的数据位为12,高2为通道选择位,共14bit  
DAC_CH1 ===》 A1 = 1;  A0 = 0;
DAC_CH2 ===》 A1 = A0 = 1 ;
使用STM32的SPI要发送2次(每次1字节) 才能完成;
又由于7612的12bit数据是移入IC内移位寄存器中,最后通过锁存信号 LDAC过进行更新有效数据;


由下图1所见,这样通过SPI发送,最后的低2bit便会移到7612的寄存器中,这样出来的数据就不正确了,因为12bit中的高2bit被移除了
所以,在A1 A0后添加2bit,这样便可得到有效的12bit进行更新7612的电压输出。

最后附上DAC7612发送程序:
void dac7612WriteValue(u8 chNum, u16 data){
    u16 value = 0x0000;
    value |= data;
    if(chNum == DAC_CH1){
        value =  (value | 0x8000);    //A1 = 1;
        value =  (value & 0xBFFF);    //A0 = 0;
    }else if(chNum == DAC_CH2){
        value =  (value | 0xC000);    //A1 = A0 = 1
    }

    DAC7612_LDAC_DISENABLE(); //h  锁存信号为高
    DAC7612_LDAC_DISENABLE(); //h
    DAC7612_ENABLE();                //L 使能7612  cs拉低

    spi1SendRecvData((value >> 8)&0x00FF);  //SPI发送
    spi1SendRecvData((value)&0x00FF);

    DAC7612_DISENABLE();
    DAC7612_DISENABLE();                //h 失能7612 cs拉高

    /* 进行锁存操作 */
    DAC7612_LDAC_ENABLE();       //L 锁存信号为低
    DAC7612_LDAC_ENABLE();
    DAC7612_LDAC_ENABLE();
    DAC7612_LDAC_DISENABLE();  //h
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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