背景
国产12位DA芯片SDA5638是用来替代TI的TLV5638的,调试采用FPGA外挂该芯片,操作总线为三线SPI仅支持写入,由于该芯片有AB两个输出通道,寄存器操作相比单通道输出的DA芯片稍显复杂,本文将简单介绍和推荐操作方式。但是在调试过程中出现寄存器时钟无法有效写入的情况。
目的
本文针对该芯片的寄存器操作分析和过程中对该问题的解决过程进行记录。
内容
一、12位DA芯片SDA5638(TLV5638)使用分享
1.1、硬件电路
供电5V;采用内部基准电压,所以6脚电容接地。
1.2、SPI操作时序
三线SPI,即不支持Master端(FPGA)读取寄存器状态。
SCLK和DATA默认状态不作要求,01均可;CS为低有效,所以默认状态必须为1。
SCLK下降沿采样,MSB操作方式,16个下降沿依次采样DB15~DB0,最后需要一个上升沿让芯片做锁存。
推荐操作时序如下(验证通过的):SPI采用CPOL = 0,CPHA = 1模式
1.3、基准电压选择
实际设计中REF采用内部基准电压,已知需求的输出电压范围为0~3V,则REF在采用内部基准电压的情况下就只能设置为2.048V。这样按照公式计算,AB两个通道输出的电压值单位为0~4.096V,可覆盖0~3V。
下面是所有寄存器的介绍,基准电压的寄存器为下图的REF1、REF0。
1.4、寄存器介绍及推荐操作
根据下面的操作示例梳理各寄存器使用情况:
1、SPD:单独配置A或B输出时使用fast mode,需要AB双通道在配置后同时输出时使用slow mode。
2、PWR:正常使用期间配置0,若有开关需求可通过操作该位关断输出。
3、R1,R0:01模式只有在AB双通道配置后同时输出的需求场景下才会用到。正常单独配置A输出用10,单独配置B输出用00。
由于本人的应用场景仅限单独配置A或B输出,不要求AB配置后同时输出,即R1,R0不使用01模式,这样操作也比较简单。所以仅参考上图操作示例中的1,2即可。推荐配置如下:
实际单独配置A或B输出时,均按如下两步骤:
1、配置SPD(固定给1)、PWR(固定给0)、{REF1,REF0}为10。
2、配置A或B的DAC value。
若要改变输出电压值,重复上面1,2步骤即可,理论上1只要配置了,不变动情况下就无需再配置,但考虑到FPGA代码设计上可以更简洁,所以干脆每次都重复配置1,2。当然如果用户有连续输出的需求,比如类似信号发生器的需求,还是不推荐这样做。
二、寄存器写入失败问题及解决
2.1、问题描述
按照手册时序Coding完代码后上板发现AB通道时钟无输出,前期主要怀疑点是时序SCLK和CS过于紧凑,但是对比手册中的各种时序参数均是满足的。也怀疑过国产芯片SCLK时钟速率是否低于手册描述操作,时钟速率太快。陆续做的排查动作和结果如下:
编号 |
思路 |
动作描述 |
结果 |
1 |
硬件连接 |
示波器单通道依次触发SCLK、DATA、CS,观察有跳变且DATA线跳变符合写入值。 |
排除硬件连接问题 |
2 |
时序 |
原本:SCLK默认态为0,第一个SCLK上升沿时将CS拉低。 修改后:CS初始先拉低,然后半个SCLK周期后SCLK拉高 |
无改善 |
3 |
时序 |
原本:SCLK默认态为0。 修改后:SCLK默认态改为1,即一次寄存器操作前后SCLK始终保持高电平。 |
无改善 |
4 |
速率 |
原本:SCLK速率为5M。 修改后:SCLK速率降低至1M,配置寄存器和数据寄存器间隔1S或800个SCLK |
无改善,但考虑到走了飞线,后面继续使用1M速率。 |
5 |
寄存器操作间隔 |
原本:单通道两次寄存器CFG和DATA操作间隔为1.6us。 修改后:CFG和DATA两次写入的间隔增加为1S |
测试多次,过程中仅一次通道正常输出,等同无改善。 |
上述尝试均未解决问题。
2.2、问题定位与解决
2.2.1、问题定位
联系原厂FAE,核对SPI时序、寄存器配置均无问题。 和FAE确认,通道的寄存器两次写入没有时间间隔要求,只要两次写入CS保证有对应完整的拉低拉高就可以。
FAE建议先通过测量基准电压管脚的电压来确认第一次寄存器配置是否正确写入。实测发现芯片6脚接近0V,确认寄存器未被正常写入。
FAE建议示波器使用三个通道,同时测量SCLK、DATA、CS确认时序。以下是触发第一次CFG寄存器配置的时序情况,蓝色为SCLK,紫色为CS,黄色为DATA。
不难发现CS拉低的过于缓慢,在DATA的第一个DB15采样的时候片选CS并未完全拉低至0V,存在丢数的风险。
FAE提供的怀疑方向为:走了飞线,长线导致前级驱动差,因为芯片内部的SPI三个端口数字结构是一样。
2.2.2、问题解决
2.2.2.1、软件规避方案
与FAE沟通后,决定从两个方向入手来解决当前问题。
第一个是增大驱动电流,由12mA增大到16mA,尝试后无改善。
第二个是FPGA逻辑上把CS再往前拉低,保证SCLK开始采数据时,CS一定已经是低电平,实测这样做问题可以解决(注意此时SCLK的速率是1M)。下图是CS提前拉低后问题解决时示波器触发的情况:
2.2.2.2、根因排查
理论上FPGA管脚输出的CS跳变是正常陡峭的,且考虑到SCLK、DATA、CS本质应该无差异,唯独CS出了问题,所以需要逐级定位下根因。
后经过次测试确认CS异常与示波器探头有关,但是提前拉低CS确实能解决问题,说明问题根源还是在时序的健壮性不足上。
2.2.3、问题思考和补充
2.2.3.1、时钟速率对飞线的信号质量影响
长线对于低速串行总线通信时序的影响可能会比较大,尤其速率的影响应该很敏感。为验证猜想,将SCLK速率改回之前的5M,实测5M速率下即使CS提前拉低了,但由于CS拉低的相比1M速率下更加缓慢,所以实测寄存器写入失败。
上图时间scale缩小后可以看到,5M速率下CS无论拉低还是拉高都很缓慢,且DATA和SCLK的噪声毛刺也过大。
三、总结
a、该DA芯片虽然无法读出寄存器状态来判断其是否寄存器值正确写入,但是可以通过寄存器设置内部基准电压值,然后测量6脚基准电压值是否生效来反推寄存器值是否被正确写入。
b、硬件链路无误的情况下,示波器触发总线操作时序,尽可能将所有信号线同时触发,这样能够对比出所有信号线变化的相对关系。条件较差的情况下,示波器也起码要使用两个通道,多个信号线两两触发确认相互间的时序关系。
c、低速串行总线虽然速率较低,但扔应该尽量避免飞线。若无法避免,操作过程中也应该尽可能采用比较低的时钟速率。