基于eBox的LTC1446驱动
LTC1446 是linear出品的双通道12bit轨对轨DAC芯片,采用SPI接口,内部基准电压,满量程输出4.095v,单电源供电(4.5-5v).8Pin封装。
![](https://images2015.cnblogs.com/blog/819021/201511/819021-20151109152147509-1450558709.png)
使用时非常简单,CLK,Din分别连接spi接口sck,MOSI. CS连接片选,低电平时从单片机接收数据,变成高电平时更新Vout
Dout可以不用连接
下面是时序图:
![](https://images2015.cnblogs.com/blog/819021/201511/819021-20151109152148040-1569934813.png)
从上图可以看到,要给LTC1446写数据,首先将CS拉低,并将数据送到Din端口,CLK的上升沿LTC1446采样Din数据,下降沿时将数据从Dout送出给主设备
采用eBox来驱动时,首先确保object.cpp和ebox.h中声明了对应的spi端口。如果没有请自己声明
object.cpp中声明如下:
![](https://images2015.cnblogs.com/blog/819021/201511/819021-20151109152148337-2041651514.png)
ebox.h中如下
![](https://images2015.cnblogs.com/blog/819021/201511/819021-20151109152148697-1591262291.png)
eBox采用了C++写法,所以首先创建类
-
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为上升沿采样送数据到从设备
![](https://images2015.cnblogs.com/blog/819021/201511/819021-20151109152149306-622318307.jpg)
将数据写入对应的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 #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 }