UART模拟7816协议开发总结(终于成功啦,一扫阴霾!写了一篇总结!!!!)

来源:互联网 发布:算法 下载 编辑:程序博客网 时间:2024/05/17 07:51
     从上周五到本周一完成了UART模拟7816协议的第一步开发,成功实现了利用MCBSTM32板卡读写智能卡的软硬件设计。期间遇到了一些困难和问题,有些是自己的粗心造成的,有些是因为对硬件不够熟悉造成的。

 

    周五的初步硬件电路搭建完成的任务完成的比较一般,但遇到的问题也不少,当时写了一个步骤,写下了一些存在的问题见下:

 

步骤及成情况和问题记录:

                          

1 测试晶振在3.3V的情况下是否可以起振       

问题:能,但是有毛刺,大小没有问题

 

2 查看PNP的BJT的连接方法                     

问题:无,可以正常使用

 

3 焊接晶振                                   

问题:无,焊接完成

 

4 硬件电路检测                               

问题:无,通过

 

5 测试ARM的输出高低是否成功                 

问题:火星,没有发现居然要设置GPIO时钟,不了解其内部结构啊!RCC_APB2PeriphClockCmd

 

6 测试输出的TX是否可以满足要求,利用示波器看 

问题:原理图上USART居然画了两遍,其实在PB上,检查出来或测试完毕,注意PB口的配置

 

7 测试与上位机的通讯是否成功                 

问题:无,成功

 

8 测试是否可收到ATR应答信号                  

问题:收到了ATR的复位应答信号:)

 

总结:

在硬件搭建中遇到的第一个问题是晶振输出有毛刺,但是在后面的测试中证实这个对电路的可实现性没有影响;

第二个问题是硬件电路检测当时认为没有问题,成为了这次开发中一次非常大的败笔,其实在周一下午老余过来之后的测试中发现我的VCC那端有虚焊现象出现,只是一根线引过去出现了问题,我没有检查出来(确切的说还是不认真所致),需要检讨一下;

第三个问题是没有发现板卡必须打开GPIO的时钟才能对其进行正常操作导致一段时间的串口不能发出数据来,也就是调用其一个函数:RCC_APB2PeriphClockCmd 虽然不知道这个函数为什么一定要加,但是这是实践出来的正确道理。。。火星;

第四个问题是提供给我的板卡电路图有问题而我没有注意到,这个责任不全在我,注意下图:

 

居然有两个地方出现了USART3……最后参考DATASHEET上发现PC10和PC11根本就没有可选功能,也就是说右上角红圈那里的参考图是错误的。

 

周五下午收到了ATR应答信号,但是不很稳定,原因在周六周日一直在寻找,其实原因就是VCC出现的那个虚焊,真丢人!

 

周六进行了一些其他的关于VC下开发清华同方那个读卡器的程序设计,对串口知识有了进一步的了解,串口图如下:

 

一定要注意这个图是公头视图,母头与其刚好境像(左右颠倒),因为这个错误的判断了RTS和CTS信号的位置。

 

通过WINDOWS提供的API函数可以实现对RTS信号的置位清零和CTS信号的监听,可以通过MSDN中查到,同方的卡利用RTS信号对卡进行复位,这个思路非常巧妙,经过我和顺顺的实际测试发现确实可以这样进行使用(学了一招)!

 

周六周日其实进展基本上是零,不断的在进行重复的测试工作,又缺乏必要的测试工具,很2。

 

周一早上来了之后发现了一个非常奇妙的现象,就是当我利用500欧的电阻上拉IO端的时候,周爱的那张卡可以正常使用;当我利用1k欧的电阻上拉IO端的时候,老余那张蓝色的卡可以使用,跟老关讨论了半天觉得是功耗问题——也就是说没张卡功耗不一样,方案有可能不能用!。。。其实还是因为VCC没有供上电有虚焊,郁闷到不行了。

 

周一下午请老余来检查出了虚焊的问题,再上电之后发现读任何一张卡返回ATR都非常稳定了,虽然觉得错误犯的很2,但是还是很爽。

 

然后和老关开始一起检测串口的波形,一个ETU一个ETU的去检查,去数,发现发出来的数据并不是我们所需要的,确切的说是错误的,如果不设置奇偶校验位还可以,一旦设置了必然会出错。后来分析发现问题是出在发送的数据不对,而智能卡检查出来数据错误了之后会向这边发送一个报错信号(低电平),从而把信号线拉低了。后来利用串口1去发出现相同的问题,上位机检测出的数据都不正确了。。。后来查找出了最终原因是因为对芯片资料的生疏,注意下图:

 

 

和下面这段话:

 

 

了解到当设置M=1时,是9位数据位,当M=0时,是8位数据位,而奇偶校验位是出现在每次的最高位上,当我们设置M=0时会导致MSB变成奇偶校验位,从而实际上只有7位数据位必然会出错。因此还是要仔细看DATASHEET啊!设置完成USART_WordLength = USART_WordLength_9b;问题就都得到解决了!

 

完成的一刻感觉很爽,老天让我遇到了最多的问题,其实是帮我熟悉这个东西……

 

另外学习到的一些知识:

一.串口的数据读写是反的,例如:

 

示波器上看到:0 11011100 1 1

数据为3B,起始位0   11011100   8数据位(反的)  1 偶校验   1 停止位

 

二.卡上调用的是7816协议,有发送数据等待,接收数据等待的功能,周爱的卡调用的是底层函数实现的功能,所以他的实现起来相对简单。

 

三. 7816协议必须有奇偶校验位,本智能卡采用的是偶校验(好象普遍都是),一定要注意串口的参数设置,不能设置成无校验。

 

四.GPIO的模式选择:

 

GPIO_Mode_AIN = 0x0,                         模拟输入

  GPIO_Mode_IN_FLOATING = 0x04,               输入悬空

  GPIO_Mode_IPD = 0x28,                         输入下拉

  GPIO_Mode_IPU = 0x48,                         输入上拉

  GPIO_Mode_Out_OD = 0x14,                     输出OD门

  GPIO_Mode_Out_PP = 0x10,                      输出推拉门

  GPIO_Mode_AF_OD = 0x1C,                      AF  OD门

  GPIO_Mode_AF_PP = 0x18                        AF  推拉门

 

后两个具体是什么设置,没有仔细去抠。。。

原创粉丝点击