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.  class LTCX
    {
    public:
    LTCX(GPIO* p_cs_pin,SPI* p_SPI) // 构造函数,初始化cs和spi pin(指针形式)
    {
    cs = p_cs_pin;
    spi = p_SPI;
    }
    void begin(uint8_t dev_num); // 初始化相关参数
    void write(uint16_t _DACA,uint16_t _DACB); // 将需要输出的值分别写入_DACA和DACB private:
    SPI_CONFIG_TYPE spi_dev_LTC1446; // 声明结构,配置SPI参数
    GPIO* cs;
    SPI* spi;
    };

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

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

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

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

使用例子

  1.  #include"ebox.h"
    #include"ltc1446.h" #define ADCA PC0
    #define ADCB PC1 LTCX ltc1(&PA6,&spi1); int main(void){
    uint32_t i =,t =;
    ltc1.begin();
    uart1.printf("init ok \r\n");
    uart1.printf("%d \r\n",i);
    while(){
    ltc1.write(-i,i);
    uart1.printf("OUTA = %d; OUTB= %d \r\n",analog_read_voltage(&ADCA),analog_read_voltage(&ADCB));
    }
    }
    }

基于eBox的LTC1446驱动的更多相关文章

  1. 基于MTD的NAND驱动开发、K9F1G08 2K page、Yaffs2 Files System

    转载:http://hi.baidu.com/cui1206/item/1d4119e376132513585dd886 基于MTD的NAND驱动(linux-2.6.22.10内核),目前已可以在该 ...

  2. 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发

    分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...

  3. 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)

    近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...

  4. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)

    [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...

  5. 基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ

    基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ 0. 导语 学习进入到了下一个阶段,还是以AD9833为例,这次学习是向设备申请中断,实现触发,在未来很多场景,比如做用 ...

  6. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  7. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  8. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  9. 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    目录 前言 聚合 聚合和聚合根原则 包含业务原则 单个单元原则 事务边界原则 可序列化原则 聚合和聚合根最佳实践 只通过ID引用其他聚合 用于 EF Core 和 关系型数据库 保持聚合根足够小 聚合 ...

随机推荐

  1. php 实现推技术comet(转)

    实现实时通信一般有两种方式:socket或comet.socket是比较好的解决方案,问题在于不是所有的浏览器都兼容,服务器端实现起来也稍微有点麻烦.相比之下,comet(基于HTTP长连接的&quo ...

  2. jQuery常用方法验证

    验证邮箱: $('input[data-name="email"]').keyup(function () { var em; em = $(this).val(); if (!e ...

  3. oracle中number类型的数据使用as string 得到的值为null

    1,如果数据的运行时类型(和数据库字段类型相同)不是字符串类型,比如number/date等,将ds.Tables[0].Rows[i][j] 调用 as string 时,不管 这个字段是否有值,这 ...

  4. hdu1241 dfs

    链接改天再补 杭电又崩了... 题意:求“@”组成了多少个联通区域,每个点的8个方向都认为是相连的 思路:对每一个点进行搜索 当Map == @ && vis == 0 时 可进入搜索 ...

  5. SurfaceView的简单使用

    package com.example.administrator.mystudent.surfaceView; import android.content.Context; import andr ...

  6. ArcGIS 使用点滴记录

    (1)ArcGIS Shapefile数据text类型字段最长为254.若想更长,使用GeoDatabase (2)ArcGIS中出现一些奇奇怪怪的问题,找不到解决方法时,一般考虑是不是空间参考的问题 ...

  7. JS移动客户端--触屏滑动事件 banner图效果

    JS移动客户端--触屏滑动事件 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的t ...

  8. 论meta name= viewport content= width=device-width initial-scale=1 minimum-scale=1 maximum-scale=1的作用

    一.先明白几个概念 phys.width: device-width: 一般我们所指的宽度width即为phys.width,而device-width又称为css-width. 其中我们可以获取ph ...

  9. lightetreeview

    http://www.16css.com/menu/905.html 其他树形菜单:很好--1.http://www.cnblogs.com/zhhh/archive/2011/11/25/22637 ...

  10. javascript通过时区获取时间

    /* 描述:时区的换算 参数:offset时区位置 使用:东八区calcTime(”+8"); */ function calcTime(offset) { // 创建一个本地日期 var ...