找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3421|回复: 21
收起左侧

奇怪的XPT2046_ADC芯片的SPI时序!

[复制链接]
ID:232366 发表于 2021-11-11 20:56 | 显示全部楼层 |阅读模式
今天在写XPT2046的ADC芯片程序时发现的一个问题对芯片使用SPI方式写入指令时的时序问题下面上逻辑分析仪波形图:

时序1

时序1

请看图一:
0通道为时钟信号
1通道为单片机写入信号(数据)
2通道为ADC    输出信号(数据)
3通道为片选信号(略)

根据数据手册得知:控制字节的位在时钟的上升沿时锁存进去。
问题1:就是在对于的逻辑分析仪2通道可以看到在写入控制字节时(因为时钟出现下降沿???)也出现了读出的时序,写入的同时就在输出???? 而且在读的时候同时也在写入(是因为读的时候时钟产生了上升沿吗????)

问题2:特别是BUSY忙时脚位到底时干嘛的?控制字节写完后此脚产生一个时钟周期的高电平???(是不是可以认为是等待ADC转换完毕的时间??)
DOUT引脚会送出ADC转换的数字量的最高位?

虚心向论坛老铁请教一下!!!!!!!!!!


CS_N:芯片选中信号,当CS_N被拉低时,用来控制转换时序并使能串行输入/输出寄存器以移出或移入数据。当该引脚为高电平时,芯片(ADC)进入掉电模式。
DCLK:外部时钟输入,该时钟用来驱动SARADC的转换进程并驱动数字IO上的串行数据传输。
DIN:芯片的数据串行输入脚,当CS为低电平时,数据在串行时钟DCLK的上升沿被锁存到片上的寄存器。
DOUT:串行数据输出,在串行时钟DCLK的下降沿数据从此引脚上移出,当CS_N引脚为高电平时,该引脚为高阻态。

BUSY:忙输出信号,当芯片接收完命令并开始转换时,该引脚产生一个DCLK周期的高电平。
当该引脚由高点平变为低电平的时刻,转换结果的最高位数据呈现在DOUT引脚上,
主控可以读取DOUT的值。当CS_N引脚为高电平时,BUSY引脚为高阻态。

完整时序图

完整时序图
回复

使用道具 举报

ID:517951 发表于 2021-11-12 08:42 | 显示全部楼层
2046这个电阻触控IC上个月用过, clcok 信号要输入8+1+16个,前面8个是写入控制字节0x90,0xd0, 再给一个clcok用于清除busy信号, 后面16个clock是用来接收12位AD转换xy的坐标。
问题1: 写入0x90,0xd0的时候,2046是不会发送AD信号的。要等busy信号清除之后,才发送。我用的过程中,写入0x90,0xd0的时候,miso上是没有信号跳变的,清除busy信号之后,2046才外发数据。
问题2:busy信号是AD转换过程需要花费时间,完成了2046会清除。

以上是我的一点经验共享。
回复

使用道具 举报

ID:232366 发表于 2021-11-12 10:24 | 显示全部楼层
rayin 发表于 2021-11-12 08:42
2046这个电阻触控IC上个月用过, clcok 信号要输入8+1+16个,前面8个是写入控制字节0x90,0xd0, 再给一个clc ...

非常感谢分享经验!我现在只是使用此芯片作为ADC模块 且并没有把BUSY管脚到单片机上。
现在的这个时序好奇怪并没有读取DOUT的数据,
写的同时也会有数据返回!!!!!!!一时半会弄不明白!!!!!!
回复

使用道具 举报

ID:624769 发表于 2021-11-12 14:42 | 显示全部楼层
DOUT 一般需要10K上拉,你的MISO 低电平肯定有问题,没有信号的时候,即使IO高阻也应该高电平。
回复

使用道具 举报

ID:232366 发表于 2021-11-12 18:12 来自手机 | 显示全部楼层
188610329 发表于 2021-11-12 14:42
DOUT 一般需要10K上拉,你的MISO 低电平肯定有问题,没有信号的时候,即使IO高阻也应该高电平。

有的!根据数据手册所说此脚是AD串行数字量输出供单片机读取 而我单片机IO脚是有对应上拉电阻的10K应该没什么问题吧? 依您所说即使没有信号时 和此脚IO高阻也应该出现高电平状态!但是现在恰恰相反! 而且出现电平跳变的地方也正是在写入控制字节时的CLOCK脉冲下出现的?我现在就是因为这个才感到疑惑。按手册所说DOUT引脚是在BUSY引脚出现下降沿时ADC转换结果的最高位会出现在DOUT引脚。现在恰恰是在写入控制字节时DOUT就已经在输出了?在逻辑分析仪上可以看出。
回复

使用道具 举报

ID:232366 发表于 2021-11-12 21:33 | 显示全部楼层
回复

使用道具 举报

ID:624769 发表于 2021-11-12 22:27 | 显示全部楼层
你试试看 调整一下时序,

拉低CS 之后,拉高DI, 给1微秒的延时之后,再拉高时钟线,看你的时序图  时钟和DI几乎同时拉高了,是不是这个原因造成你的DOUT 又拉低了呢?因为没有收到有效信号?
回复

使用道具 举报

ID:232366 发表于 2021-11-14 00:02 | 显示全部楼层
188610329 发表于 2021-11-12 22:27
你试试看 调整一下时序,

拉低CS 之后,拉高DI, 给1微秒的延时之后,再拉高时钟线,看你的时序图  时钟 ...

以按照您建议操作也并未有啥改善  反倒直接没有输出了!尴尬
回复

使用道具 举报

ID:420836 发表于 2021-11-14 03:48 | 显示全部楼层
感谢分享有关 SPI 时序
回复

使用道具 举报

ID:517951 发表于 2021-11-14 09:56 | 显示全部楼层
用示波器抓下波形相对逻辑分析仪要准确一点, 逻辑分析仪对速度快点的信号可能不准确,给你造成误导. 希望对你有用.
回复

使用道具 举报

ID:232366 发表于 2021-11-14 11:25 | 显示全部楼层
TTQ001 发表于 2021-11-14 03:48
感谢分享有关 SPI 时序

一起学习
回复

使用道具 举报

ID:232366 发表于 2021-11-14 11:26 | 显示全部楼层
rayin 发表于 2021-11-14 09:56
用示波器抓下波形相对逻辑分析仪要准确一点, 逻辑分析仪对速度快点的信号可能不准确,给你造成误导. 希望对 ...

感谢提出建议!
回复

使用道具 举报

ID:624769 发表于 2021-11-14 12:49 | 显示全部楼层
SHANWAZI 发表于 2021-11-14 00:02
以按照您建议操作也并未有啥改善  反倒直接没有输出了!尴尬

是这个东西吧?

XPT2046.png

按时序图上看, CS拉底后,DI 必须置1,然后再给时钟,此时Dout会为低,所以你说的没“输出”如果指为低,那么就对了。
唯一不确定的,就是下面那两条线Dirver1 and 2,是否必须在第五个时钟拉高,是不是必要条件,但是感觉,拉高的时机来看,必须拉高了,后面才会有Busy, Dout才会有回传。你现在横竖不成功,可以试试。
回复

使用道具 举报

ID:232366 发表于 2021-11-14 13:22 | 显示全部楼层

是的是的他的真正在处于转换是不是在BUSY变成高电平后的八个时钟周期或者是12个?
回复

使用道具 举报

ID:624769 发表于 2021-11-14 14:05 | 显示全部楼层
SHANWAZI 发表于 2021-11-14 13:22
是的是的他的真正在处于转换是不是在BUSY变成高电平后的八个时钟周期或者是12个?

真正转换,应该在busy为高,表示在转换。
此时你再给一个时钟,之后,就安静等待Busy为低,等到busy 为低了,DOUT就会输出,可能是1可能是0这个不用管,反正给够12个时钟,收足12个位数据,然后再算到底是多少。
回复

使用道具 举报

ID:232366 发表于 2021-11-14 14:39 | 显示全部楼层
188610329 发表于 2021-11-14 14:05
真正转换,应该在busy为高,表示在转换。
此时你再给一个时钟,之后,就安静等待Busy为低,等到busy 为 ...




转换.PNG

实际上篮筐这里才是才是真正的AD转换对不???也就是BUSY变为高电平后的  前面的控制字节写完后BUSY就是高电平了,
是不是可以考虑使用一点延时等一下过去????BUSY的下降沿时刻会把ADC结果最高位出现在DOUT供外部读取!!!!!
回复

使用道具 举报

ID:624769 发表于 2021-11-14 16:32 | 显示全部楼层
当Dout开始输出的时候,转换已经完毕了,
所以,你唯一需要等待的,只是BUSY 变低电平。
代码上来讲,你只需要在发完PD0之后, BUSY == 1 之后,
再给一个时钟 即第9时钟,之后,
while(BUSY);  傻等BUSY为0即可
然后,就是接受12位数据。
按时序图上看,收完11位数据后,收最后一位数据时 Driver 2 需要给低电平,然后再给3个空时钟,然后CS拉高。
回复

使用道具 举报

ID:232366 发表于 2021-11-14 16:59 | 显示全部楼层
188610329 发表于 2021-11-14 16:32
当Dout开始输出的时候,转换已经完毕了,
所以,你唯一需要等待的,只是BUSY 变低电平。
代码上来讲,你 ...

感谢指导!!!!!  似乎明白这时序图了!!!!原来一直是我看错时序图了。
回复

使用道具 举报

ID:232366 发表于 2021-11-14 20:57 | 显示全部楼层
SHANWAZI 发表于 2021-11-14 16:59
感谢指导!!!!!  似乎明白这时序图了!!!!原来一直是我看错时序图了。

捕获.PNG

但是看起来时序也不太对  和实际输出值差异大读取错误!!!!!!!!!!
回复

使用道具 举报

ID:624769 发表于 2021-11-14 22:07 | 显示全部楼层
你试试看极端值,比如最低,或者最高,是不是给你全0,全1,是的话,就说明,通讯肯定是对的,如果不是的话,那么还是分析分析Driver 1 & 2 这里是不是有什么问题。 手册我没仔细看。毕竟这芯片我也没有,研究了也没啥用,但是,比较确定的是,Driver 1 & 2 肯定是有一定用处的。 也许是触控板的控制,也许是ADC控制,细读手册吧, 按IO的标注来看,通信协议有点类似 MicroWire 非常接近SPI 但不是SPI的协议,比如第一个1, 以及等待Busy, 都是MicorWire 协议的特征,所以,如果真是MicroWire协议的话,那么,时序要求是非常严格的,你再仔细对照手册看看吧。不排除,要ADC之前,要额外发个什么指令初始化之类的。
回复

使用道具 举报

ID:232366 发表于 2021-11-15 21:58 | 显示全部楼层
188610329 发表于 2021-11-14 22:07
你试试看极端值,比如最低,或者最高,是不是给你全0,全1,是的话,就说明,通讯肯定是对的,如果不是的话 ...

非常感谢提出建议和思路我再细看一下芯片手册!!!!!!!!
回复

使用道具 举报

ID:1118271 发表于 2024-4-25 14:24 | 显示全部楼层
SHANWAZI 发表于 2021-11-15 21:58
非常感谢提出建议和思路我再细看一下芯片手册!!!!!!!!

你好,我也遇到这个问题,不知道能否给一下后面您的进一步探究结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表