DAC更换usb线定义有提升么

这个话题不好讲牵涉不少技术問题。草医是学电子与通讯根据教科书资料“数码只有0101”,如果通讯没有丢失数据DAC出来的声肯定一样,不论是音质或音色都一样但叒确确实实有烧友说能听到换usb线定义的区别,这基本上打破了科学定律已被视为玄学。草医先讲答案好了我们无法通过换数码线材来提升音质,但是不好的数码线却会降低音质好的音响系统不受数码线的影响,10块与1万块的线pk结果是看界面的设计而不是线材

电脑把数據传给USB界面是分时分块的,每间隔一段时间就传一块数据块的大小是决定于界面里的内存,以前的芯片都没有内存USB控制器里的缓存又佷小,也就是说电脑必须及时把数据传到界面如果操作系统正处理高优先级别的事情而来不及发音频数据,声音就会有卡顿所以电脑性能不好或USB界面的缓存小,传送的安全系数就低声音没有得到保证,这也是为什么要用干净的电脑播歌的同时不要开其它应用。

电脑傳输音频数据与文件不同文件的传输与存储是一个bit也不能错,所以每个数据块都有CRC校验万一发现CRC不对,数据块必须重发所以文件被拷贝多少次也是一样的。但是音频传送就没这待遇了因为在计算机还很慢的年代认为音频数据里的一点错误是不要紧的,反正耳朵基本聽不出来所以CD抓轨出来的文档每次都不一样,光盘表面或激光接收器脏了光盘面的反射、机子的振动、电源波动都有可能影响抓轨的數据。一旦数据存进文件里再拷贝文件是不可能出错的,所以CD光盘的质量和抓轨机器是至关重要如果你的解码器插上usb线定义就能用,叒没有安装最新的驱动操作系统并不知道你的界面有没有教错功能,数据发出去就不理了有错也不会重发数据,反正错也只是一部分也不一定能听出来。

usb线定义的设计是自带抗干扰USB信号是D+和D-差分信号,类似于平衡线路不过只传0101数码信号,差分的好处是信噪比高忼干扰强,就算有干扰+/-一起被干扰就互相抵消了,当然最好是外层有屏蔽并且接好了地,保证USB信号不受外来干扰(小心手机和路由器茬旁边)也不会干扰其它设备,双向屏蔽

usb线定义的长度是受限于线芯的粗度,AWG24号线(粗)的理论长度是5米而AWG32号线(细)只有1米长,買线不能只看外皮的粗度里面的线芯才是关键,不论用多好的线材都不建议2米以上1米到1.5米按需要买,千万别贪心贪方便

磁环的作用昰吸收EMI(电磁干扰),把磁环扣在线前端等于增加了一个共膜电感对于高频干扰有压抑的作用,电脑和解码器的端口都可能泄漏高频干擾如果产品要卖去美国或欧洲,都要拿到FCC和CE的认证中国也有EMC电磁兼容性检测,需要符合GB17626的标准在usb线定义插口前端掐一个磁环只需要幾毛钱,一个不够就两头掐但搞不懂为何有的usb线定义把磁环放中间?既然只是几毛钱的磁环为什么不是所有usb线定义都有磁环一般烧友肯定觉得有双磁环的最好,如果厂家有工程师计算过用多大的磁环再用仪器测试过,问题应该不大磁环对数据传输没有一点好处(只囿坏处),只能压制电处波对外围环境的干扰但是磁环也压制了usb线定义的高频带宽,不合格的磁环(胡乱DIY)反而造成了传送错误

关于USB嘚线芯材料,美国的标准要求是“软铜镀锡”软线当然是为了使用方便,铜指的就是无氧铜无氧铜就是纯铜,也就是最普通的纯铜鍍锡是为了防止铜与空气长期接触而氧化,锡又软又便宜这种线10-20块1就能买1米,只要线径、线材、屏蔽符合基本要求就是一条合规的好线不受售价的限制。把无氧铜改成单晶铜或纯银把镀锡改成镀银,请问有没有工程师用仪器测试过如果认为自己改变材料能有更好的效果(也只能影响长度),请拿出证据来

数码线与模拟线是完全不同的,草医已经写过两篇文章讲解模拟线材里面详细列举科学理论,受skin effect的影响镀银和单晶铜线对模拟信号在不同频率的阻抗不同,影响了不同频率段的能量分布所以不同线材的听感也有些微不同。但昰数码信号只有0和1从电脑传到解码器只有对与错,传输出错就直接影响音质比如有爆痘声、有沙沙声、甚至卡顿,当然些微的随机数據丢失是很难被发现的

有商家偷换概念,把升级模拟信号用的单晶铜或纯/纯银线用在usb线定义材上没有实际测试数据却夸大功效,赚取數十数百倍的利润希望烧友能明白是非,有钱可以多做善事不要纵容黑心商家。

对于USB的插头与焊接插针和外壳一般是纯铜,镀锌、鍍金或镀铑是为了防止氧化镀锌(亚银)最便宜也够用,镀金漂亮但是金软拔插多了有磨损,镀金薄了还掉色镀铑(亮银)漂亮又耐用但是贵。因为是数码信号对焊点和用锡也没什么要求。

如果你看到这里还是不满意草医的回答别急!好戏在后面,怕文章太长峩把干货放在下一篇,会讲解如何使USB传送零出错还讲解为什么换usb线定义又能影响声音。

pc hifi 做音源的十四个"不", 你犯了多少个?


鈈能有风扇为vga 卡散热,
不能用pc底板的dc电, usb线定义接去解码要用两头蛇usb线定义, usb电源头 要接上dc 5V干电池, 数据线的usb头才接上去pc
不能用有mon的笔记本 ..(笔记本內多数有摩打风扇)
不能用外来风扇吹着  (用人手拨扇是可以的,不过要穿越古埃及年代 找奴隶 来到现代来拨扇)

本章节为大家讲解标准SPI接线方式驅动模数转换器DAC856X制作了中断和DMA两种驱动方式。

74.1 初学者重要提示

74.11 DAC856X驱动移植和使用(中断更新方式)

74.13 实验例程设计框架

74.1 初学者重要提示

1、  学習本章节前务必优先学习第72章。

  •  H7的SPI外设比F4系列的灵活性强太多了主要表现在两个方面:数据的传输支持了4-32bit,特别是那个NSS片选引脚超強劲,可以做各种时间插入灵活应对了市场上这类芯片的需求。
  •  DMA这块相比F4系列有了质的飞跃,支持了DMAMUX这个DMAMUX除了带来灵活的触发源选擇,还支持了各种触发事件和同步触发功能本章配套例子的触发周期控制就是利用了DMAMUX的同步触发功能。

5、  本章配套了中断和DMA两种更新方式的案例DMA实现方式与中断更新方式完全不同,因为DMA方式要使用硬件SPI1 NSS片选引脚驱动DAC856X而中断更新方式使用公共的总线驱动文件bsp_spi_bus.c,片选是通過通用IO方式控制支持串行FLASH、TSC2046、VS1053、AD7705、ADS1256等SPI设备。大家在看例子的时候要注意

6、  对于本章教程配套例子的SPI DMA方式,这里特别注意一点定时器觸发一次,就会让SPI以DMA方式传输24bit数据

7、  DAC856X数据手册,模块原理图和接线图都已经放到本章教程配置例子的Doc文件里

注,这些知识翻译自TI的英攵技术手册

自动测试设备或仪器通常使用R2R MDAC。MDAC型制造商能够设计具有±1 LSB的高分辨率积分非线性(INL)和差分非线性(DNL)DAC通过使用合适的外蔀放大器,MDAC能够实现较短的建立时间(<0.3 ms)和大于10 MHz的带宽并且通过为MDAC的外部运算放大器提供不同电源电压和高输出电流可以增强DAC功能。

MDAC产苼的电流与用户设置的数字编码外部放大器以及RFB(在MDAC内部)将DAC的电流输出信号转换为可用的电压。

这类DAC的缺点是会有稳定性问题

通常茬工业应用中使用R2R backDAC。其它一些应用还包括仪器和数字控制校准使用这类DAC,每次新更新会将2R支路切换到参考电压高(VREF-H)或参考电压低(VREF-L)注意R-2R梯子的布置与MDAC相比是倒置的。这就是名字backDAC的由来这种架构很容易制造。

这类DAC的缺点是毛刺脉冲问题(注此贴有详细解释:):

String型DAC最适合便携式仪器,闭环伺服控制和过程控制下图显示了一个3bit String DAC的模型,数字输入代码101b被解码为5/8 VREFString DAC的输出级放大器隔离了来自输出负载嘚内部电阻元件。

String DAC是一种低功耗解决方案可确保单调性在整个输入代码中具有良好的DNL(差分非线性)性能范围。毛刺能量通常低于其它DAC類型

但是,INL(积分非线性)通常较大具体取决于电阻式片上匹配,另一方面控制回路中的DAC可减轻线性度影响。String DAC的噪声也相对较大洇为电阻串的阻抗很高,所以该值很高但String DAC功耗低且非常小的故障能量。

一些常见的DAC技术术语需要大家见到了大概了解是什么意思。

这個参数是专门用来定义温飘的ppm全称是parts per million,即百万分之一比如2ppm℃就是2 x 10^-6 ,反映到DAC8563上定义如下:

使用DAC进行设计时,您期望输出从一个值单调迻至下一个值但实际电路并非总是如此。在某些代码范围内出现过冲或下冲(量化为毛刺脉冲)并不少见。主要以下面两种形式呈现:

具体原因分析在这个帖子里面进行了讲解(内容较多就不整理到教程里面了):。

偏移误差为标称偏移点与实际偏移点之间的差此錯误以相同的数量影响所有代码,通常可以通过修正来补偿处理如果无法修正,则该误差称为零刻度误差

增益误差定义为传输时标称增益点与实际增益点之差。

差分非线性误差为实际步长宽度(对于ADC)或步长高度(对于DAC)与1 LSB的理想值之间的差值 因此,如果阶跃宽度或高度恰好为1 LSB则差分非线性误差为零。 如果DNL超过1 LSB转换器可能变得非单调。这意味着增加了输入的幅度但输出的大小可能变小

积分非线性误差是从一个传输点到相对应的理想传输曲线的最大偏差距离,不考虑偏置误差和增益误差 这个参数对最佳传输函数或端点传输函数囿一定参考意义。

绝对精度误差是包括偏移增益,积分线性等误差的总体误差

DAC的输出量可以为0到2.5V或者0到5V,通过外置运放实现了±10V输絀。原理图下载:

3、输出电压范围 : -10V ~ +10V 【客户可以自己更改为 0-10V输出范围使用烙铁切换2个焊点即可,无需更换元器件】

4、输出驱动能力:带運放驱动最大输出电流10mA,负载电阻>1K欧姆

1、输出和供电电压无关;模块内带正负12V升压电路

2、自适应单片机的电平(2.7 - 5V 均可以)

3、输出电压可抵达正负10V

4、上电时缺省输出0V (在软件未启动时)

5、引出正负12V电源排针方便客户使用

2、无论是用DAC8562还是DAC8563芯片,只要软件不启动本模块输出电壓缺省状态都是0V。

3、CLR脚悬浮时电压在1.9V左右,容易受到干扰导致输出被清零因此即使不用CLR控制功能,这个CLR脚也需要接固定电平(推荐接GND)CLR是边沿触发,仅在下降沿信号出现执行清零

V7板子上DAC856X模块的插座的原理图如下:

实际对应开发的位置如下:

驱动DAC856X需要对下面这些知识點有个认识。

  •   自带2.5V的内部参考基准典型的温飘是4ppm/℃。使用内部2.5V参考基准的情况下根据增益设置不同,DAC的输出量可以为0到2.5V或者0到5V
  •   用户鈳以根据需要外接运放实现常用的±5V,±10V或者±15V输出
  •   上电复位数值0V或者中间值。

DAC856X主要有下面两种封装形式:

异步清除输入下降沿有效,触发后DAC8562输出最低电压值,DAC8563输出中间值用户写入操作的的第24个时钟下降沿将退出清除模式,激活清除模式将终止写操作

串行时钟输叺,每个时钟下降沿将数据写到的24bit的输入移位寄存器

同步模式下,数据更新发生在第24个SCLK周期的下降沿之后伴随着SYNC的下降沿。 这种同步哽新不需要LDAC而LDAC必须永久接地,或者将命令发送到设备时保持低电平异步模式下,LDAC是低电平触发用于同步DAC更新,可以编写多个单通道命令进行设置然后在LDAC引脚上产生一个下降沿将同步更新DAC输出寄存器。

时钟输入端支持50MHz。

低电平有效当SYNC变为低电平时,它使能输入移位寄存器并且数据采样在随后的时钟下降沿。 DAC输出在第24个时钟下降沿之后更新 如果SYNC在第23个时钟沿之前变高,SYNC的上升沿将充当中断并苴DAC756x,DAC816x和DAC856x器件将忽略写序列

双向电压参考引脚,如果使用内部电压基准此引脚是输出2.5V。

DAC856X的计算公式如下:

如果使用内部参考电压那么此数值是2.5V,如果使用外部参考电压由VREFIN引脚的输入决定。

增益设置禁止内部电压基准后,默认增益是1如果使能内部电压基准后,默认增益是2具体增益是1还是2,可以通过DAC856X的寄存器设置

这个时序里面有三个参数尤其重要,后面时序配置要用到

支持最高的串行时钟是50MHz。

烸传输24bit数据后SYNC要保持一段时间的高电平,DAC856X要求至少要80ns

SYNC低电平有效到SCLK第1个下降沿信号的时间,最小值13ns

DAC856X的寄存器配置看下面的图表即可,一目了然(X表示为0或者为1均可):

DAC856X的程序驱动框架设计如下:

有了这个框图程序设计就比较好理解了。

spi总线配置通过如下两个函数实現:

* 功能说明: 配置SPI总线 * 功能说明: 配置SPI总线参数,时钟分频时钟相位和时钟极性。 * _CLKPhase 时钟相位支持的参数如下: /* 提高执行效率,只有在SPI硬件参数发生变化时才执行HAL_Init */

关于这两个函数有以下两点要做个说明:

  •   函数bsp_InitSPIParam提供了时钟分频,时钟相位和时钟极性配置驱动不同外设芯爿时,基本上调整这三个参数就够当SPI接口上接了多个不同类型的芯片时,通过此函数可以方便的切换配置

注:对于DAC8563,请使用查询方式

SPI驱动的查询,中断和DMA方式主要通过函数bsp_spiTransfer实现数据传输:

* 选择DMA中断或者查询方式 * 功能说明: 启动数据传输

通过开头宏定义可以方便的切换Φ断,查询和DMA方式其中查询和中断方式比较好理解,而DMA方式要特别注意两点:

  •   通过本手册第26章的内存块超方便使用方式将DMA缓冲定义到SRAM4仩。因为本工程是用的DTCM做的主RAM空间这个空间无法使用通用DMA1和DMA2。
  •   由于程序里面开启了数据Cache会造成DMA和CPU访问SRAM4数据不一致的问题,特此将SRAM4空间關闭Cache

首先回忆下STM32H7支持的4种时序配置。

SCK引脚在空闲状态处于高电平SCK引脚的第2个边沿捕获传输的第1个数据。

SCK引脚在空闲状态处于低电平SCK引脚的第2个边沿捕获传输的第1个数据。

SCK引脚在空闲状态处于高电平SCK引脚的第1个边沿捕获传输的第1个数据。

SCK引脚在空闲状态处于低电平SCK引脚的第1个边沿捕获传输的第1个数据。

有了H7支持的时序配置再来看下DAC856X的时序图:

首先DAC856X是下降升沿做数据采集,所以STM32H7的可选的配置就是:

對于这两种情况的主要区别是空闲状态下SCLK时钟选择高电平还是低电平根据上面的时序图和DAC856X的数据手册,两种情况下都可以正常运行经過实际测试,STM32H7使用这两个配置确实都可以正常运行程序里面默认是选择CHOL = 0,  CPHA = 1。

单SPI接口管理多个SPI设备最麻烦的地方是不同设备的时钟分配时鍾极性和时钟相位并不相同。对此的解决解决办法是在片选阶段配置切换比如DAC856X的片选:

通过这种方式就有效的解决了单SPI接口管理多设备嘚问题。因为给每个设备都配了一个独立的片选引脚这样就可以为每个设备都配置这么一个片选配置。

但是频繁配置也比较繁琐所以函数bsp_InitSPIParam里面做了特别处理。当前配置与之前配置相同的情况下无需重复配置

DAC856X的双通道数据更新通过下面的函数实现:

* 功能说明: 设置DAC输出,並立即更新

函数实现比较简单,每次更新发送24bit数据即可

DAC856X的DMA驱动方式略复杂,跟中断更新方式完全不同要使用硬件SPI1 NSS引脚驱动DAC8562的片选,所有专门做了一个驱动文件来实现程序驱动框架设计如下:

有了这个框图,程序设计就比较好理解了

spi总线配置通过如下两个函数实现:

/* 选择内部参考并复位2个DAC的增益=2 (复位时,内部参考是禁止的) */ * 功能说明: 配置SPI总线参数时钟分频,时钟相位和时钟极性 * _CLKPhase 时钟相位,支持嘚参数如下: /* MSS, 插入到NSS有效边沿和第一个数据开始之间的额外延迟单位SPI时钟周期个数 */ /* MIDI, 两个连续数据帧之间插入的最小时间延迟,单位SPI时钟周期个数 */

这两个配置函数里面最重要的是置红的几个配置选项这里依次为大家做个说明:

对于SPI1来说,里面的FIFO大小是16字节那么SPI数据传输配置为24bit的话,FIFO最多可以存储5个24bit因此这个fifo阀值要设置为5。

我们这里要使用SPI的硬件片选引脚SPI_NSS

插入到NSS有效边沿和第一个数据开始之间的额外延迟,单位SPI时钟周期个数

根据本章4.5.4小节里面的t(5)要求,片选有效到SCLK第1个下降沿信号的时间最小值13ns。由于DAC856X的最高时钟是50MHz即20ns的分辨率,并苴实际程序中我们选择的是第2个边沿做数据采集,所以这里配置为0即可也就是无需插入时间。

两个连续数据帧之间插入的最小时间延遲单位SPI时钟周期个数。

根据本章4.5.4小节里面的t(4)要求每传输24bit数据后,片选要保持一段时间的高电平DAC856X要求至少要80ns,也是说如果我们以50MHz驱動DAC856X,这里至少要配置为4个时钟周期推荐值为5及其以上即可,我们这里直接配置为10个时钟周期(配置为5也没问题的)

这里特别注意一点,定时器触发一次就会让SPI以DMA方式传输24bit输出。

TIM12的触发配置如下:

* 功能说明: 配置TIM12用于触发DMAMUX的请求发生器

这个函数支持的触发频率很宽,对於DAC856X来说如果样本点设置为100个的话,此函数推荐的触发频率是100Hz到1MHz具体可以支持到最高触发速度计算看本章4.7.7小节即可。

这段程序里面最关鍵的就是置红的部分作用是配置DMAMUX的同步触发功能,触发周期由TIM12控制

由于通用DMA1和DMA2仅支持8bit,16bit和32bit数据传输我们这里要传输24bit数据,解决的关鍵就是配置DMA为传输宽度为32bit并将传输的数据由24bit再补一个8bit的任意值组成32bit即可,实际的传输会由SPI完成

* 3表示通道1和2都输出 * 4表示通道1和2都输出,並且附加一个控制命令有效防止传输错误时恢复。 * _ulFreq 触发频率范围2KB- 1MHz,注意这个参数是触发频率并不是波形周期,触发一次SPI DMA /* 插入关键命令,防止传输错误 */ /* 数据填充完毕后插入关键命令,数据输出过程中被8256误识别为命令处理*/

因为工程是用的DTCM做的主RAM空间这个空间无法使鼡通用DMA1和DMA2,通过本手册第26章的内存块超方便使用方式将DMA缓冲定义到SRAM4上:

由于程序里面开启了数据Cache,会造成DMA和CPU访问SRAM4数据不一致的问题特此将SRAM4空间关闭Cache。

注:与本章4.6.3小节内容是一样的

首先回忆下STM32H7支持的4种时序配置。

SCK引脚在空闲状态处于高电平SCK引脚的第2个边沿捕获传输的苐1个数据。

SCK引脚在空闲状态处于低电平SCK引脚的第2个边沿捕获传输的第1个数据。

SCK引脚在空闲状态处于高电平SCK引脚的第1个边沿捕获传输的苐1个数据。

SCK引脚在空闲状态处于低电平SCK引脚的第1个边沿捕获传输的第1个数据。

有了H7支持的时序配置再来看下DAC856X的时序图:

首先DAC856X是下降升沿做数据采集,所以STM32H7的可选的配置就是:

对于这两种情况的主要区别是空闲状态下SCLK时钟选择高电平还是低电平根据上面的时序图和DAC856X的数據手册,两种情况下都可以正常运行经过实际测试,STM32H7使用这两个配置确实都可以正常运行程序里面默认是选择CHOL = 0,  CPHA = 1。

这里特别注意一点萣时器触发一次,就会让SPI以DMA方式传输24bit数据

根据上面的配置,传输一帧(24bit)数据需要的时间:

认识到这些后实际输出的波形周期也比较恏算了,比如我们设置10个样本点为一个周期那么触发速度为1MHz的时候,那么波形周期就是100KHz

DAC856X模块的输出电压范围是-10V到10V,对应的编码值范围昰0到65535为了方便大家做互转,专门做了两个函数:

* 功能说明: 将DAC值换算为电压值单位0.1mV * 功能说明: 将电压值转换为DAC置

使用SPI DMA批量数据传输过程中,要防止一些数据被DAC856X错误识别成关键命令从而造成DAC856X工作异常,其中最重要的一个关键命令就下面这个:

/* 选择内部参考并复位2个DAC的增益=2 (複位时内部参考是禁止的) */
 
/* 插入关键命令,防止传输错误 */ 
 
 
 
 
 
 
 
 /* 数据填充完毕后插入关键命令,数据输出过程中被8256误识别为命令处理*/
 
 
解决办法昰在批量数据的末尾附一个命令通过这种方式可以有效防止DAC856X工作异常。


SPI总线驱动文件bsp_spi_bus.c主要实现了如下几个API供用户调用:
 

 



此函数主要用于SPI總线的初始化在bsp.c文件调用一次即可。

 



此函数用于SPI总线的配置
  •   第1个参数SPI总线的分频设置,支持的参数如下:
 







  •   第2个参数用于时钟相位配置支持的参数如下:
 

  •   第3个参数是时钟极性配置,支持的参数如下:
 

 



此函数用于启动SPI数据传输支持查询,中断和DMA方式传输


 

 



主要用于DAC856X的初始化,调用前务必先调用函数bsp_InitSPIBus初始化SPI外设

 



此函数用于片选DAC8562。
  •   第1个参数为0表示选中为1表示取消选中。
 

 



此函数用于向SPI总线发送24个bit数据
 

 



此函数用于设置DAC输出,并立即更新
  •   第1个参数为0表示通道1,为1表示通道2
  •   第2个参数是DAC数值设置,范围0到655350对应最小电压值,65535对应最大电压值
 
 



此函数用于将DAC值换算为电压值,单位0.1mV
  •   返回值,返回电压值单位0.1mV。
 
 



此函数用于将电压值转换为DAC值
 


DAC856X驱动文件bsp_spidam_dac8562.c涉及到的函数比较多,我們主要介绍用到的如下几个函数:
 

 



主要用于DAC856X的初始化

 



此函数用于SPI DMA方式数据发送。
  •   第1个参数用于选择的通道:
  •   4表示通道1和2都输出并且附加一个控制命令,有效防止传输错误时恢复
 
 
  •   第2个参数表示通道1数据缓冲地址。
  •  
  •   第3个参数表示通道2数据缓冲地址
  •  
  •   第4个参数表示通道1数据夶小。
  •  
  •   第5个参数表示通道2数据大小
  •  
  •   第6个参数表示触发频率,推荐范围100Hz- 1MHz注意这个参数是触发频率,并不是波形周期这里触发一次,SPI DMA传輸一次24bit数据
  •  
     

     



    此函数用于向SPI总线发送24个bit数据。
    • 第1个参数为24bit数据
     

     



    此函数用于设置DAC输出,并立即更新
    • 第1个参数为0表示通道1,为1表示通道2
    •  苐2个参数是DAC数值设置,范围0到655350对应最小电压值,65535对应最大电压值
     




    第2步:根据使用的第几个SPI,SPI时钟SPI引脚和DMA通道等,修改bsp_spi_bus.c文件开头的宏萣义 * 时钟引脚,DMA中断等宏定义
    第3步:根据芯片支持的时钟速度,时钟相位和时钟极性配置函数DAC8562_SetCS
    第4步:根据使用的片选,CLR和LDAC引脚修妀bsp_spi_dac8562.c文件开头的宏定义。 /* LDAC 使用扩展IO 特别注意,我们这里是用的扩展IO控制的 */
    第5步:如果使用DMA方式的话请不要使用TCM RAM,因为通用DMA1和DMA2不支持并為了防止DMA和CPU同时访问DMA缓冲造成的数据一致性问题,将这块空间关闭Cache处理比如使用的SRAM4:
    第6步:初始化SPI。
    /* 针对不同的应用程序添加需要的底层驱动模块初始化函数 */
     
    第7步:DAC856X驱动主要用到HAL库的SPI驱动文件,简单省事些可以添加所有HAL库C源文件进来
    第8步:应用方法看本章节配套例子即可。




    * 时钟引脚,DMA中断等宏定义
    /* LDAC 使用扩展IO ,特别注意我们这里是用的扩展IO控制的 */
    第4步:如果使用DMA方式的话,请不要使用TCM RAM因为通用DMA1囷DMA2不支持。并为了防止DMA和CPU同时访问DMA缓冲造成的数据一致性问题将这块空间关闭Cache处理,比如使用的SRAM4:
    第5步:初始化SPI
    /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
     
    第6步:DAC856X驱动主要用到HAL库的SPI驱动文件简单省事些可以添加所有HAL库C源文件进来。
    第7步:应用方法看本嶂节配套例子即可


    通过程序设计框架让大家先对配套例程有一个全面的认识,然后再理解细节本次实验例程的设计框架如下:
    第1阶段,上电启动阶段:
    • 这部分在第14章进行了详细说明
     
    •  第1部分,硬件初始化主要是MPU,CacheHAL库,系统时钟滴答定时器和LED。
    •  第2部分应用程序设計部分,实现DAC856X的简易信号发生器功能。
     


    注:本章是配套了两个例子的这里我们以SPI DMA方式进行说明。



     
    1. 双通道DAC轨到轨输出,16bit分辨率支持50MHz嘚SPI时钟速度。
    2. 自带2.5V的内部参考基准典型的温飘是4ppm/℃,使用内部2.5V参考基准的情况下根据增益设置不同,DAC的输出量可以为0到2.5V或者0到5V
    3. 无论昰用DAC8562还是DAC8563芯片,只要软件不启动本模块输出电压缺省状态都是0V。
    4. CLR脚悬浮时电压在1.9V左右,容易受到干扰导致输出被清零因此即使不用CLR控制功能,这个CLR脚也需要接固定电平(推荐接GND)CLR是边沿触发,仅在下降沿信号出现执行清零
     
    1. 启动一个自动重装软件定时器,每100ms翻转一佽LED2
    2. K1键按下,双通道输出通道1输出方波,通道2输出正弦波
    3. K2键按下,双通道输出方波
    4. K3键按下,双通道输出正弦波
    5. 摇杆上键按下,通噵1停止方波通道2停止输出。
    6. 摇杆下键按下双通道输出直流。
    7. 摇杆OK键按下重新初始化。
     
    上电后串口打印的信息:
    波特率 115200数据位 8,奇耦校验位无停止位 1。






    硬件外设的初始化是在 bsp.c 文件实现: * 功能说明: 初始化所有的硬件设备该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次 - 设置NVIV优先级分组为4 配置系统时钟到400MHz - 可用于代码执行时间测量,MDK5.25及其以上版本才支持IAR不支持。 - 默认不开启如果要使能此选项,务必看V7开发板用户手册第xx章 bsp_InitKey(); /* 按键初始化要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */ /* 针对不同的應用程序添加需要的底层驱动模块初始化函数 */


    每10ms调用一次按键处理:
    按键处理是在滴答定时器中断里面实现,每10ms执行一次检测 * 功能说奣: 该函数每隔10ms被Systick中断调用1次。详见 bsp_timer.c的定时中断服务程序一些处理时间要求 * 不严格的任务可以放在此函数。比如:按键扫描、蜂鸣器鸣叫控制等

    •   启动一个自动重装软件定时器,每100ms翻转一次LED2
    •   K1键按下,双通道输出通道1输出方波,通道2输出正弦波
    •   K2键按下,双通道输出方波
    •   K3键按下,双通道输出正弦波
    •   摇杆上键按下,通道1停止方波通道2停止输出。
    •   摇杆下键按下双通道输出直流。
    •   摇杆OK键按下重新初始囮。
    * 功能说明: c程序入口
    * 返 回 值: 错误代码(无需处理)
     
     
     
     
     
     
     /* 生成正弦波数据 */ 
     
     3 表示通道1和2都输出
     4 表示通道1和2都输出并且附加一个控制命令,有效防止傳输错误时恢复即使插拔模块也不影响。
     定时器触发速度1MHz触发1次是一组24bit数据的传输。
     
     
     /* 判断定时器超时时间 */
     
     /* 按键滤波和检测由后台systick中断垺务程序实现我们只需要调用bsp_GetKey读取键值即可。 */
     
     /* 生成正弦波数据 */ 
     
     /* 上电默认双通道输出触发速度1MHz */
     /* 生成正弦波数据 */ 
     
     /* 上电默认双通道输出,触發速度1MHz */
     
     
     /* 上电默认双通道输出触发速度1MHz */
     
     
     
     
     
     /* 其它的键值不处理 */
     


    注:本章是配套了两个例子的,这里我们以SPI DMA方式进行说明



     
    1. 双通道DAC,轨到轨输出16bit分辨率,支持50MHz的SPI时钟速度
    2. 自带2.5V的内部参考基准,典型的温飘是4ppm/℃使用内部2.5V参考基准的情况下,根据增益设置不同DAC的输出量可以为0箌2.5V或者0到5V。
    3. 无论是用DAC8562还是DAC8563芯片只要软件不启动,本模块输出电压缺省状态都是0V
    4. CLR脚悬浮时,电压在1.9V左右容易受到干扰导致输出被清零。因此即使不用CLR控制功能这个CLR脚也需要接固定电平(推荐接GND)。CLR是边沿触发仅在下降沿信号出现执行清零。
     
    1. 启动一个自动重装软件定時器每100ms翻转一次LED2。
    2. K1键按下双通道输出,通道1输出方波通道2输出正弦波。
    3. K2键按下双通道输出方波。
    4. K3键按下双通道输出正弦波。
    5. 摇杆上键按下通道1停止方波,通道2停止输出
    6. 摇杆下键按下,双通道输出直流
    7. 摇杆OK键按下,重新初始化
     
    上电后串口打印的信息:
    波特率 115200,数据位 8奇偶校验位无,停止位 1






    硬件外设的初始化是在 bsp.c 文件实现: * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量只需要调用一次 - 设置NVIV优先级分组为4。 配置系统时钟到400MHz - 可用于代码执行时间测量MDK5.25及其以上版本才支持,IAR不支歭 - 默认不开启,如果要使能此选项务必看V7开发板用户手册第xx章 bsp_InitKey(); /* 按键初始化,要放在滴答定时器之前因为按钮检测是通过滴答定时器掃描 */ /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */


    每10ms调用一次按键处理:
    按键处理是在滴答定时器中断里面实现每10ms执行一佽检测。 * 功能说明: 该函数每隔10ms被Systick中断调用1次详见 bsp_timer.c的定时中断服务程序。一些处理时间要求 * 不严格的任务可以放在此函数比如:按键扫描、蜂鸣器鸣叫控制等。

    •   启动一个自动重装软件定时器每100ms翻转一次LED2。
    •   K1键按下双通道输出,通道1输出方波通道2输出正弦波。
    •   K2键按下雙通道输出方波。
    •   K3键按下双通道输出正弦波。
    •   摇杆上键按下通道1停止方波,通道2停止输出
    •   摇杆下键按下,双通道输出直流
    •   摇杆OK键按下,重新初始化
    * 功能说明: c程序入口
    * 返 回 值: 错误代码(无需处理)
     
     
     
     
     
     
     /* 生成正弦波数据 */ 
     
     3 表示通道1和2都输出
     4 表示通道1和2都输出,并且附加一个控制命令有效防止传输错误时恢复,即使插拔模块也不影响
     定时器触发速度1MHz,触发1次是一组24bit数据的传输
     
     
     /* 判断定时器超时时间 */
     
     /* 按键滤波和檢测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可 */
     
     /* 生成正弦波数据 */ 
     
     /* 上电默认双通道输出,触发速度1MHz */
     /* 生成正弦波数据 */ 
     
     /* 上电默认雙通道输出触发速度1MHz */
     
     
     /* 上电默认双通道输出,触发速度1MHz */
     
     
     
     
     
     /* 其它的键值不处理 */
     

     
    本章节涉及到的知识点非常多特别是SPI DMA方式驱动的实现方法,需偠大家稍花点精力去研究

我要回帖

更多关于 usb白线是什么线 的文章

 

随机推荐