基于eBox的LTC1446驱动

      LTC1446 是linear出品的双通道12bit轨对轨DAC芯片,采用SPI接口,内部基准电压,满量程输出4.095v,单电源供电(4.5-5v).8Pin封装。

      
    使用时非常简单,CLK,Din分别连接spi接口sck,MOSI. CS连接片选,低电平时从单片机接收数据,变成高电平时更新Vout
Dout可以不用连接
     下面是时序图:
      
     从上图可以看到,要给LTC1446写数据,首先将CS拉低,并将数据送到Din端口,CLK的上升沿LTC1446采样Din数据,下降沿时将数据从Dout送出给主设备
     采用eBox来驱动时,首先确保object.cpp和ebox.h中声明了对应的spi端口。如果没有请自己声明
     object.cpp中声明如下:
     
     ebox.h中如下
     
     
     eBox采用了C++写法,所以首先创建类
  1.  1 class LTCX
     2 {
     3 public:
     4     LTCX(GPIO* p_cs_pin,SPI* p_SPI) // 构造函数,初始化cs和spi pin(指针形式)
     5 {
     6 cs  = p_cs_pin;
     7     spi = p_SPI;
     8 }
     9 void begin(uint8_t dev_num);      // 初始化相关参数
    10 void write(uint16_t _DACA,uint16_t _DACB);    // 将需要输出的值分别写入_DACA和DACB
    11 
    12 private:
    13     SPI_CONFIG_TYPE spi_dev_LTC1446; // 声明结构,配置SPI参数
    14 GPIO* cs;
    15     SPI* spi;
    16 };

         begin函数中,对spi和cs进行初始化。将CS->mode放在spi初始化后面的好处。可以将spi没有用到的pin设置成普通io使用,在本应用中,将PA6(spi miso)作为cs pin 使用

 1 void LTCX::begin(uint8_t dev_num)
 2 {
 3     spi_dev_LTC1446.dev_num = dev_num;             // 用来区分多个spi设备
 4 spi_dev_LTC1446.mode = SPI_MODE0;                  // spi模式
 5 spi_dev_LTC1446.prescaler = SPI_CLOCK_DIV256;      // spi速度
 6 spi_dev_LTC1446.bit_order = SPI_BITODER_MSB;       // 发送顺序 
 7 
 8 spi->begin(&spi_dev_LTC1446);                      // 初始化spi
 9     cs->mode(OUTPUT_PP);                           // cs设置为输出模式
10 cs->set();
11 }

     关于SPI_MODE,从下图可以看到,mode0为上升沿采样送数据到从设备

    将数据写入对应的DAC寄存器中。因为LTC1446的DAC值保存在24bit的寄存器中,所以每次发送数据必须一次性写入24bit,高12位是DACA,低12位是DACB。
 1 void LTCX::write(uint16_t _DACA,uint16_t _DACB)   
 2 {
 3 uint32_t _DAC_volue = _DACA<<12|(_DACB &0x0fff);    // 合并数据
 4 spi->take_spi_right(&spi_dev_LTC1446);                 // 获取spi使用权限,并配置spi参数
 5 cs->reset();                                           // 片选,准备写数据
 6 // 将_DAC_volue的值从24-->0的顺序写入设备,每次8bit
 7     spi->write(((uint8_t*)(&(_DAC_volue)))[2]);
 8     spi->write(((uint8_t*)(&(_DAC_volue)))[1]);
 9     spi->write(((uint8_t*)(&(_DAC_volue)))[0]);
10     cs->set();                                             // 写数据结束,更新dac out
11     spi->release_spi_right();                           // 释放spi使用权
12 }

    使用例子

  1.  1 #include"ebox.h"
     2 #include"ltc1446.h"
     3 
     4 #define ADCA PC0
     5 #define ADCB         PC1
     6 
     7 LTCX ltc1(&PA6,&spi1);
     8 
     9 int main(void){
    10 uint32_t i =2048,t =0;
    11     ltc1.begin(1);
    12     uart1.printf("init ok \r\n");
    13     uart1.printf("%d \r\n",i);
    14 while(1){
    15     ltc1.write(4096-i,i);
    16     uart1.printf("OUTA = %d; OUTB= %d \r\n",analog_read_voltage(&ADCA),analog_read_voltage(&ADCB));
    17 }
    18 }
    19 }

     





posted @ 2015-11-09 13:24  好心情_梦想  阅读(1097)  评论(0编辑  收藏  举报