你好,我的设计中有通过FPGA的产生SPI控制器访问PCB上若干片DAC8734,但是只有部分成功,部分访问失败。个人觉得是芯片内部问题,希望TI专家能帮忙定位一下。下图是时序图:
访问异常的时序图:
SDI input: 0x8000AF
SDO output: 0x00024F
访问异常放大细节图,前半部分:
访问异常后半部分放大图:
访问正常的波形:
SDI input: 0x8000AF
SDO output: 0x80003C
访问正常放大图,前半部分和后半部分:
user151383853:
从波形图看数据, 是对得上的.不知道错误是你说的出来的数据错误, 还是波形错误.
可能问题在于你的配置
toapex:
回复 user151383853:
谢谢回复。
波形和数据都是错误。我读的是reg0,是command寄存器,command寄存器的最后两个bit是reserve的,读出来是0才对,但是读错的那个返回的是1。而且SPI内部是一个24bit的shift register,我第一次访问明明是读,在紧接着的第二个访问周期,SDO却告诉我正在写这个寄存器。
现在不光是reg0,其他reg读写都不正常,经常莫名其妙的返回一些值,没有规律但是值是固定。
toapex:
回复 user151383853:
你好,请问能理解我的意思吗?
问题描述中,我发送的数据都是:0x8000AF,表示读reg0,这个寄存器的默认值为0x003C(由于两个GPIO被我拉低了)。正常的返回值确实正常,异常的却返回异常的值。
而且实际使用中,读某个寄存器理论上和度后面所带的数据无关,但却有关系。比如:
SDI input:1000,0000,0000,0000,0000,0000(0x800000)SDO output:1000,0000,0000,0000,0011,1100(0x80003C)
then:
SDI input:1000,0000,0000,0000,0000,0010(0x800002)
SDO output:0000,0000,0000,0000,0000,0110(0x000006)
then:
SDI input:1000,0000,0000,0000,0000,0000(0x800000)
SDO output:1000,0000,0000,0000,0000,0100(0x800004)
我第一次读reg0(16bit数据全0),SDO输出正确的值即DAC读的数据是003C,第二次读reg0(16bit数据为0x0002),SDO输出错误的值,DAC返回正在写reg0,写成0x0006,第三次我再读reg0(16bit数据全0),SDO返回在读reg0,值为0x0004.
上面是访问异常的DAC,我一共有45个DAC,有很多访问正常,在访问正常的DAC上去写reg0,写0x0006,再读回来发现就是0x0004.
说明访问异常的情况第二读被芯片误以为是在写。
Kailyn Chen:
回复 toapex:
您好,您这里提到访问若干片DAC8734, DAC8734是以Daisy-Chain mode接的是吗?
还是访问一片出现时序问题? 时序的话,建议对照datasheet中的时序图(不论是daisy-mode,还是stand-alone mode)。
toapex:
回复 Kailyn Chen:
不是daisy-chain mode,是stand alone。45个DAC,CLK,CS,SDI是点对点连接。SDO是3合一连接(意思是同一时间只能读3个中的一个)。
45片中10片有问题。时序我已经粘贴图片,访问频率是3.125M,时序余量非常之大。正是因为找不到和时序图中不同之处才无从下手。
谢谢你的回复。
xyz549040622:
回复 toapex:
看来楼主发现了一个手册上没写的注意事项。可以说说吗?
toapex:
回复 xyz549040622:
主要还是时序的问题。时钟在芯片内部会被输入数据的沿串扰。
e2e.ti.com/…/855444