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. Windows环境下的NodeJS+NPM+Bower安装配置步骤

    Windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的“INSTALL”按钮 ...

  2. [转]AS3的垃圾回收

    GC和内存泄露无关 垃圾回收,这次是一个被无数人讨论过的传统话题. Action Script使用的是和Java相似的内存管理机制,并不会即时回收废弃对象的内存,而是在特定时间统一执行一次GC(Gab ...

  3. java实现BitMap

    package bitmap; public class BitMap { private byte[] bytes; public BitMap(byte[] bytes) { super(); t ...

  4. Daily Scrum 10.24

    昨天我们的工作已经全面开始了,本来想等今天(25号)看那个燃尽图和燃速图能不能出来,结果还是没有,就先把我们的Task统计贴上来吧. 今天的Task统计: 至于燃尽图和燃速图的问题已经发老师邮件提问了 ...

  5. vbox下Oracle Enterprise liunx5.4虚拟机安装10G RAC实验(三)

    接第二篇 http://www.cnblogs.com/myrunning/p/3996183.html 4.安装集群软件 4.1验证安装环境 经过检查发现以下3个包检查未通过: compat-gcc ...

  6. 笔记本(WIN7|XP)发射wifi信号 当无线路由使用

    Windows7系统 第一步:是你的电脑上要有两个网卡一个有线一个无线(笔记本应该都有)台式机可以考虑买个USB无线网卡(50左右) 第二步:win+R  CMD  输入(只输入红色部分) netsh ...

  7. MyBatis简单实例

    ---直接贴代码 (1)User.Java package me.gacl.domain; /** * @author gacl * users表所对应的实体类 */ public class Use ...

  8. 修改SQL Server 2005 数据库文件名字

    对于SQLServer 2005的数据库文件名字的修改.不多说,见图: 对于数据库名的更改直接选中要修改的数据库,F2,你懂的,不懂的可以去屎了.....0.0 下面要修改数据库的文件名 原理就是利用 ...

  9. 大量查询SQL语句 实例

    1.查看表结构语句:DESC   表名   2.查询所有列:select  *  from  表名   3.查询指定列:select  字段名  form  表名   4.查询指定行:SELECT * ...

  10. [译]line clampin让文字在指定的行数内省略号显示

    说明 (1)原文:http://css-tricks.com/line-clampin/ (2)非直译 需求: 当文字长度超过N行时,文字后面自动用省略号补齐. 比如,你有如下的HTML代码: < ...