之前写过了mcu通过硬件spi接口向dac芯片ad5764的数据寄存器写值输出电压,ad5764的offset与gain寄存器的值也是可以通过硬件spi读出来的。
第一步:将待读取的芯片设置为读模式

回读的命令定义如下:

当要回读时,应向输入移位寄存器写入0x010000,因为要将REG2、REG1、REG0全部设置为0,将A2、A1设置为0,将A0设置为1,同时将DB0设置为0;
第二步与第三步:

可以看到在时序图中,回读发生了2次数据发送(spi是同步通信,发送几次意味着接收几次),第一次发送向芯片写入命令,告诉芯片准备读哪个通道的哪个寄存器,返回的数据是未定义的,可以不用管;第二次发送NOP,接收芯片返回的寄存器的值。
接下来就是编写代码实现功能了,因为板子上有2颗ad5762与2颗ad5764,还是需要使用菊花链通信。
数据定义:

//REGISTER MAP
#define AD5764_NOP      0x000000
#define READ            0x800000
#define WRITE           0x000000
#define REG_FUNCTION    0x000000
#define REG_DATA        0x100000
#define REG_COARSE_GAIN 0x180000
#define REG_FINE_GAIN   0x200000
#define REG_OFFSET      0x280000
#define DAC_A           0x000000
#define DAC_B           0x010000
#define DAC_C           0x020000
#define DAC_D           0x030000
#define DAC_ALL         0x040000
#define SDO_ENABLE      0x000000
#define SDO_DISABLE     0x000001enum lcc_ch_num{ch1 = 1, ch2, ch3, ch4, ch5, ch6
};enum lcc_ch_abcd{a = 1, b, c, d
};typedef struct DAC_SEND_ARRAY
{uint32_t send_array[4];//ABuint32_t send_cd_array[4];//CDuint32_t receive_array[4];
}ad_5764_spi;

spi读写函数的实现过程,细讲

//spi读写函数的实现过程在之前的博文中
void hw_spi_read_write(uint32_t *send_data, uint32_t *receice_data, uint8_t size)
{SPI_SET_SS0_LOW(SPI1);for (uint8_t i = 0; i < size; i++){SPI_WRITE_TX0(SPI1, send_data[i]);SPI_TRIGGER(SPI1);while (SPI_IS_BUSY(SPI1));receice_data[i] = SPI_READ_RX0(SPI1);}SPI_SET_SS0_HIGH(SPI1);LDAC = PIN_LOW;Delay(1);LDAC = PIN_HIGH;
}void daisy_chain_readregister(enum lcc_ch_num ch, enum lcc_ch_abcd abcd, uint32_t RegisterSelect)
{memset(spi_ad5764.send_array, 0, sizeof(spi_ad5764.send_array));// 设置ad5764为读模式if (ch == ch1){spi_ad5764.send_array[3] = 0x010000;}else if (ch == ch2){spi_ad5764.send_array[2] = 0x010000;}else if (ch == ch3 || ch == ch4){spi_ad5764.send_array[1] = 0x010000;}else if (ch == ch5 || ch == ch6){spi_ad5764.send_array[0] = 0x010000;}hw_spi_read_write(spi_ad5764.send_array, spi_ad5764.receive_array, 4);switch (ch){case ch1:if (abcd == a){spi_ad5764.send_array[3] = READ + RegisterSelect + DAC_A;}else if (abcd == b){spi_ad5764.send_array[3] = READ + RegisterSelect + DAC_B;}break;case ch2:if (abcd == a){spi_ad5764.send_array[2] = READ + RegisterSelect + DAC_A;}else if (abcd == b){spi_ad5764.send_array[2] = READ + RegisterSelect + DAC_B;}break;case ch3:if (abcd == a){spi_ad5764.send_array[1] = READ + RegisterSelect + DAC_A;}else if (abcd == b){spi_ad5764.send_array[1] = READ + RegisterSelect + DAC_B;}break;case ch4:if (abcd == c){spi_ad5764.send_array[1] = READ + RegisterSelect + DAC_C;}else if (abcd == d){spi_ad5764.send_array[1] = READ + RegisterSelect + DAC_D;}break;case ch5:if (abcd == a){spi_ad5764.send_array[0] = READ + RegisterSelect + DAC_A;}else if (abcd == b){spi_ad5764.send_array[0] = READ + RegisterSelect + DAC_B;}break;case ch6:if (abcd == c){spi_ad5764.send_array[0] = READ + RegisterSelect + DAC_C;}else if (abcd == d){spi_ad5764.send_array[0] = READ + RegisterSelect + DAC_D;}break;default:break;}//发送读哪个寄存器和哪个通道hw_spi_read_write(spi_ad5764.send_array, spi_ad5764.receive_array, 4);memset(spi_ad5764.send_array, 0, sizeof(spi_ad5764.send_array));memset(spi_ad5764.receive_array, 0, sizeof(spi_ad5764.receive_array));for (uint8_t i = 0; i < 4; i++){spi_ad5764.send_array[i] = AD5764_NOP;}//发送接收命令hw_spi_read_write(spi_ad5764.send_array, spi_ad5764.receive_array, 4);
}

至此回读功能就实现了。在测试过程中发现,在设置为读模式回读寄存器值之后,如果要向数据寄存器写入值输出电压,直接使用写命令即可,无需将芯片设置为写模式;另外我使用NUC123SD4AN0的SPI1接口可以将时钟设置为16MHz,写命令是正常的,但是回读的时候,每次都少了2个bit(第0位和第1位),当我把SPI的时钟降低为8MHz时,回读会少1个bit(第0位),当把时钟降低为4MHz时,回读的数据才正确无误了,不知为何。

ad5764的回读,硬件spi接口相关推荐

  1. 物联网常用模块_工业级SPI接口WiFi模块WG228助力工业物联网数据传输

    工业物联网简单来说就是工业领域的物联网技术,物联网架构可分为三层:感知层.网络层和应用层,主要涵盖了数据的采集.传输及分析应用.物联网应用都有一个共同点:收集数据并将其发送到服务器或其他系统中,在数据 ...

  2. CC2652RB硬件SPI驱动W5100S网卡进行回环测试

    1. W5100S 1.1 简介 W5100S 是一款多功能的单芯片网络接口芯片,内部集成全硬件的TCP/IP协议栈,以太网MAC和 10Base-T/100Base-TX以太网控制器.主要应用于高集 ...

  3. AD硬件电路模块设计——PS7219及单片机的SPI接口电路

    1 PS7219简介 PS7219是一种新型的串行接口的8位数字静态显示芯片.它是由武汉力源公司新推出的24脚双列直插式芯片,采用流行的同步串行外设接口(SPI),可与任何一种单片机方便接口,并可同时 ...

  4. 非标准语法;请使用 _一文读懂使用MCU SPI访问具有非标准SPI接口ADC的方法

    好文章当然要分享啦~如果您喜欢这篇文章,请联系后台添加白名单,欢迎转载哟~ 问题 能否用MCU访问非标准SPI接口? 答案 可以,但可能需要做一些额外的努力. 当前许多精密模数转换器(ADC)具有串行 ...

  5. max7456 C语言,用于MAX7456随屏显示器SPI接口的C程序

    摘要:MAX7456随屏显示(OSD)发生器具有SPI™兼容接口,本应用笔记介绍了SPI接口的工作原理,文中还包含在微控制器内逐位模拟SPI接口的控制器C程序. MAX7456支持高达10MHz接口时 ...

  6. 用于MAX7456随屏显示器SPI接口的C程序

    用于MAX7456随屏显示器SPI接口的C程序 David Fry, 应用工程师经理 摘要:MAX7456随屏显示(OSD)发生器具有SPI™兼容接口,本应用笔记介绍了SPI接口的工作原理,文中还包含 ...

  7. 有关DSP2812与SPI接口DA芯片的通信(AD5640,AD5682)

    使用DSP2812控制SPI接口DA芯片总结: 本文只针对SPI接口的DA芯片,通常用到的DA芯片有精度位16位/14位/12位的.我在这次过程中用到的都是14位的,刚开始使用的是AD5640的DA芯 ...

  8. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  9. 下载的内容:MSP430F149利用硬件SPI口读写串行Flash M25P64

    /*****************<SPI_Flash.C>**************************************/ #include "SPI_Flas ...

最新文章

  1. VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug
  2. 深究AngularJS——ng-checked(回写:带真实案例代码)
  3. SpringBoot任务调度案例(学习笔记)
  4. python机制_python 加载模块机制
  5. python连接数据库mysql错误1045、手动登录可以_登录mysql错误1045解决方法
  6. python 闭包中的匿名函数详解!
  7. python怎么清理垃圾_【原创】python实现清理本地缓存垃圾
  8. 冲刺阶段—个人工作总结07
  9. 阶段3 2.Spring_08.面向切面编程 AOP_1 AOP的概念
  10. sir模型matlab案例_直播案例 | 人群接触网络中的 SIR 疫情模拟
  11. xp怎么查看计算机配置,怎么查看xp系统的配置信息
  12. 小水智能-智能楼宇智慧建筑3d可视化,让钢铁水泥也可以沟通交流
  13. html网站title、description和keywords、
  14. 电脑上怎么发出电子版准考证
  15. 盘点买房贷款的八大注意事项
  16. Smart Link Monitor Link
  17. 人生就是一场永不停歇的修行
  18. 思科无线AP配置之三(在web页面对ap进行配置)
  19. 工业相机如何调整SDK枚举顺序或者打开顺序
  20. Andriod入门级开发

热门文章

  1. Henry前端笔记之 CSS相关
  2. 全志A63_SDK_User_Manual,全志A63_Android N快速移植手册
  3. Java习题练习:拉马车
  4. 写给那些搜了很多教程安装win10但老是提示报错的童鞋
  5. javaScript回调函数
  6. 算法训练营 重编码_您可能不需要$ 15K的编码训练营
  7. 择时策略1:一个金叉死叉(python)
  8. PDA 无线网络设置
  9. DDR3布线设计要点总结
  10. SAP中公司与公司代码关系