需求用一台好的示波器来抓才干有满足的存储深度,确保你能够过滤掉那个该死的50clock。
依照Arm的手册,每次转化发送方都需求一个TNR可是我调查JLINK的波形却没有那个该死的TNR。
手册中说异步SWD需求,同步不需求-或许相反,可是我没有找到关于同步异步的描绘。
权且不论他,横竖现在疏忽掉TNR就能够读到该死IDR。
别的JLINK的复位时序很古怪,大致是
70clk High,0xe79e(留意,SWD是LSB First),
70clk High,0xedb6(这儿很古怪,找不到描绘),
70clkHigh,16clk Low,0xa5,
留意这儿依照协议应该是TNR位-可是没有实践观测到这个位,
0b100(ACK-OK),0xba01477……
实践测验,不额定添加那个古怪的0xedb6也能够照旧读出IDR。
别的要留意,设备端的数据最哈哦在CLK的下降沿读取,或许上升沿往后延时1/2bit后读取。
假如想要深究,能够去sourceforge.net去下载SWD Lib,以及openOCD,两者对照着来会很便利。
利用好bitband写程序会很舒畅,尤其是处理SWD的位流,一个int32指针跳起来很爽,而且是LSB First的结构。
彻底没有任何妨碍的。
别的发现在读IDR后,其他的读写指令的ACK后边,SWDIO会有两个bits的缓慢上升波形,
而且在clk的下降沿被Target拉底,依照格局硬套的话,这两个位应该疏忽掉。
现在还没发现关于这两个位的说法。
有的时分能够看到当JLink读取信息的最终会把本该由Target发送的parity拉低,疏忽掉。
还有需求留意的是,如同除了读IDR,CTRL,ABOUT这三个寄存器外,其他的寄存器读取都有一个数据帧的推迟。
比方你建议第一个读取贞,读到的数据没有意义。
第二个读取帧,读到的是第一次的地址对应的数据,顺次类推。
硬件上,SWDIO的上拉要满足强,否则上升沿或许不行峻峭,我现在用的是2.2k,还将就。
看到SWD LIB的源码晒干是依照8位读写,32位读写的方法来做的。
也便是说,只需操控好SWCLK,而且能够确保不丢掉任何SWDIO位信息,用SPI也能够模拟出SWD的时序。
这部分参阅了SourceForge的LibSwd项目,该项目是开源的,写的很谨慎,代码风格也很好,激烈我们下来看看。
原始代码是四个函数,读,写,8,32.我归结到两个函数,用了bitband结构所以进口就简略了一些,缓冲区和位数即可
int iLibSwdMosi(unsigned int* pBits,unsigned int iLen){unsigned int i;for(i=0;i
看到return(0)你想到了什么?
嘿嘿,原本我是选用定时器来操控clk的,这样就需求考虑程序运转犯错的回来代码。
后来发现这样很傻,就该成死等了。
这样就不需求回来反常信息了,可是为了坚持形式上的一致,函数仍是带有回来值的姿态。hoho
这儿是延时函数,大写的量是宏界说
int iLibSwdDelay(unsigned int iDly){unsigned int i,k;for(i=0;i
这儿是切换到SWD形式而且读取IDR的函数。
int iLibSwdSwitch2SWD(void){unsigned int i;for(i=0;i
假如成功读取会回来一个指针,这个指针对应的缓冲区是预先申请好的,我们程序没有改完,所以这儿还不太美观。我们自己发挥吧。
上面用/**/屏蔽部分便是我说的JLINK波形中很古怪的当地,屏蔽和不屏蔽在读取IDR时如同没什么别离。
不知道JLINK用来做什么的。有知道的么?
有时分为了差异是Host仍是Target送出的bit,能够在时序上做一点修整。
Target总是在Clk的上升沿送出数据,Host能够在上升沿前面一点送出数据,
这样就能够经过示波器来差异到底是Target仍是Host发送的0
别的,手册中有说到,在每个数据帧后边附加几个额定的clk周期。
JLink的波形上也的确有这样的表现。不过如同不是总呈现。
暂时没发现这块的影响,或许是通用性的考虑吧