AT91RM9200和MB86391串口通信

对前一段时间工作的总结

 

12.14日接手到ARMAT91RM9200)和MB86391通讯项目,到1.12日完成可以通信,中间走了许多弯路,以此记录过程中的经验和教训。

 

刚接手项目时对ARMMB86391都不了解,但是出于对硬件和驱动的喜爱开始时兴奋异常,太想接触自己想做的事。所谓过犹不及,先前的过分自信也造成了第三个星期一度想放弃。担子是一点点加上去的,不能给自己太大的压力。

想法是逐步成熟的,这点绝对没错。实践才能发现问题,整个想法的历程是模拟串口à使用ttyS1à用编写驱动的方法使串口符合实际使用à直接修改内核改变串口参数。

刚开始MB86391串口控制接口是连接在三个普通的ARM IO口上,所以第一感觉就是使用串口模拟的方式来完成串口通信。上百度搜索发现串口模拟的方式多数用在单片机,ARM的串口模拟资料非常少,一是因为在有操作系统的情况下,usleep等延时函数非常不精准。如我用usleep延时5us实际达到4.7ms,误差之大根本无法实现特定串口波特率,波特率为9600时钟周期为104us,这个时间必须要精准才能准确无误的接收和发送数据,但要实现精确到微秒级不容易(以我现在的知识水平来看不容易,但是模拟串口是一定可以的)。二是因为肯定有更好的方法,事实确实如此,AT91RM9200作为工业级芯片已经提供了一个DEBUG串口和四个普通扩展串口,这要归功于一个AT91RM9200串口的测试程序,该程序是裸机下的程序,但对硬件资源的使用扩展了编程思维。

为什么不直接使用呢?稳定性也能得到保证,何必去模拟。搜索到一份资料,里面记录着在linux 2.6内核中,已经将ARM的串口1打开了,真是冥冥之中自有定数。打开PCB电路图,发现MB86391DATAOUTDATAINCLK引脚刚好接在ARM串口1引脚102103104的附近,只要将引脚线更改一下,就可以直接使用AT91RM9200自带的串口功能,请硬件组更改后,编写应用程序测试确实可以发送串口数据。到此完成第一个问题。

接下来碰到一个更大的难题,通过对1300EC的串口时钟线进行测量,发现其同步时钟频率为1.932M(周期520ns),而以波特率9600速率传输(周期104us)下载firmware时间肯定太长(同步模式的速度是波特率9600200[104us/520ns],如果同步下载是20s,则以9600下载为4000s[66m],实际下载时间为20分钟)。这时就必须修改内核参数使ARM串口工作在同步模式下,查找资料没有,论坛发布问题得到结果是看芯片手册。自己太急躁,加上感冒,所以夜不能寐,白天精神不好,一度怀疑自己是否适合做这个工作。静下心来,觉得是自己急于求成,没有真正的虚心学习,其实只要静下来分析任何的问题都能解决。于是将ARM芯片手册的USART部分再看了一遍,对它的寄存器结合测试程序进行综合分析,发现其实在内核中修改参数也是可以的,修改/driver/serial/atmel_serial.c中的atmel_set_termios函数,设置模式寄存器为同步模式。通过用示波器测量,串口确实工作在同步模式下。到此解决第二个问题,回想其实这根本就不是问题,因为太简单,有一种只缘身在此山中的感觉。

第三个问题是MB86391根本就不返回信息,从开始这个问题就一直存在,那是因为MB86391根本没有工作。在1300EC代码中发现PONReset_ENC函数,去掉该函数,1300EC根本就不能接收到FPGA的返回信息(FPGA作为中转,也就是MB86391的返回信息)。这真是对我的当头一棒,也就是说从一开始我就没有注意到这个函数,认为它根本没有作用,其实该函数就是对MB86391的复位函数。搜索复位相关资料发现:

复位作用:

1上电复位对内部寄存器进行复位,否则寄存器状态未知

2同步内外部时钟信号,防止频率不稳定和晶振停振

3有些高级芯片,不先复位根本不工作

4有复位引脚的芯片必须复位,这是电子设计的基本要求

复位作用如此重要,而我却视而不见。一个原因是MB86391的产品手册上没有提及复位系统要复位才能工作,可能是硬件都默认要复位,所谓的潜规则,也是没有经验所致。二是自己不细心,没有提前看到复位代码部分。

这次项目犯了一个最大错误是开发顺序的本末倒置,与硬件通信的底层程序必须要先确保硬件是运行的。如果这次能先将MB86391启动并工作,开发周期可以节省一到两周,因为在异步模式下9600波特率时接收到MB86391的信息,可以极大的激发开发的兴趣,这样在修改内核使串口工作在同步模式下也会很顺利。芯片手册上有些话不能照搬,如M86391中有如果工作在同步模式下,DATAOUT3.3K的上拉电阻,如果工作在异步模式下,DATAOUT3.3K的下拉电阻。这些都是建议,不必完全符合,如DATAOUT10K的上拉电阻也是可行的。过程中一直发愁怎样去让DATAOUT上拉下拉3.3K电阻,浪费了不少脑细胞。

下面将过程中的一些经验和资料列出,谨记!

 

 

 

 

1、  如果没找到相关资料,可能是有更合适的方法可以替代,如搜索AT91RM9200定时器的使用(模拟串口时),找不到资料,说明没有多少人使用过。最后发现AT91RM9200已经扩展了4个通用的USART,直接使用就行。现搜索AT91RM9200串口使用就会搜索到相关的资料

 

2. 每次更改代码就必须要烧写才能看结果,建议做一个ARMjtag工具

 

3. at91rm9200的初始时钟默认是32.768K,所以外部晶振接32.768K,如果最小系统搭建成功,在DEBUG串口上会打印出“CC…”符号

 

4. pcb板上没有测试点,增加焊盘测试点非常重要

 

5. 处理这种串口通讯时,应配合示波器,事半功倍
串口不通的话,首先利用示波器检测通讯端口是否接收到了串口通讯信号,若有,注意观察信号的电平峰谷变化是否足够。如果这两样没有问题,则转而向MCU程序部分检查。此时应采用断点执行和单步执行相配合的方式,首先检查串口的相关初始化是否成功进行,其次则是时钟的计算配置是否匹配。若再不行,则只有慢慢的单步执行,看哪里出现了比较隐秘的BUG

 

 

6. 硬件为什么没有工作,有哪几个方面的原因   电压?时钟?复位电路?

简单的芯片上电自动复位,高级芯片要控制其复位,对硬件的测量主要就是这三个方面。

 

7 现象:ENCODER_RESET函数注释掉,第一次烧录进去,软件启动可以通过串口给MB86391发送数据

原因:没有关闭电源,MB86391中的寄存器值还是保存,这就是可以进行串口下载的状态

关闭电源重启后,程序阻塞,说明MB86391没有给FPGA发送数据

 

8 如果有软件可以对比,一定要对该软件进行细致的分析,与项目相关的代码一定要全部看完并理解,

该次项目就是没有注意到芯片复位部分函数,想当然当成没有实际用处的代码。仔细分析发现,芯片的

复位操作非常重要

复位作用:

[1]上电复位对内部寄存器进行复位,否则寄存器状态未知

[2]同步内外部时钟信号,防止频率不稳定和晶振停振

[3]有些高级芯片,不先复位根本不工作

[4]有复位引脚的芯片必须复位,这是电子设计的基本要求

 

9 如果确认软件没有大错误,一定要分析硬件问题。每一个脚(重要的)都先测量一遍,这一次就是没有测试时钟脚,时钟线已经断开没有同步时钟,肯定接收不到返回信息

 

10 文档一定要理解,像此次同步模式设置,只需改变模式寄存器sync部分就可以运作。修改MSBF等都在内核中有体现,静才能解决问题

 

11. 芯片并不是一开机就会运行,需要有一定的条件,先解决芯片运行的问题,然后在解决通信程序。做芯片程序时,不能急躁,仔细分析已有的代码,争取一步一个脚印,步步为营才能时时有收获。

 

1.18 添加

 

12.在通讯程序中加入打印语句容易出现问题

 

 

13.速度还是太慢需要进行修改,修改成PDC模式速度是否有改善

1.19 添加

14. 只发送不检查接收,每次发送一个字节,需要的时间是16秒

 

 

 

1.8M 发送数据中间间隔为(40-45us),一个完整字节发送是11位(11周期,方便计算以10周期),每周期为550ns,发送一字节大约是5.5us。间隔可以发送8个字节,如果间隔缩短为20us。则可以将效率提高将近一倍。如果是16秒完成,则可以在9-10秒内完成下载

你可能感兴趣的:(AT91RM9200和MB86391串口通信)