//------------------------------------------------------------------------

  1. #include   "AT16C554.H"
  2. //--------------------------------------------------------------------------------------------------
  3. code        Uint    PORTAddrTABLE[PortNumber]={STARTADDR_SERIAL1,
  4. STARTADDR_SERIAL2,
  5. STARTADDR_SERIAL3,
  6. STARTADDR_SERIAL4};          //串口端口地址映射表
  7. xdata       TCommHandle     CommDevice[PortNumber];
  8. sbit        reset_16c554 =  P1^4;                                           //ST16C554 复位控制线
  9. //---------------------------------------------------------------------------------------------------
  10. //  Define Private Faction
  11. //-----------------------------------------------------------------------------------------------------
  12. bool ReadPortRecBuf(uchar Port,Uchar *Byte);
  13. bool WritePortSendBuf(uchar Port,Uchar Byte);
  14. void Port_open(Uchar PortID,Uint Baud);
  15. //-------------------------------------------------------------------------
  16. //  Define Public Faction
  17. //-------------------------------------------------------------------------
  18. bool Init_16c554(void);
  19. void Port_open(Uchar PortID,Uint Baud);
  20. //void Port_open(Uchar PortID,int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop);
  21. void Port_close(Uchar PortID);
  22. int  Port_Receive(Uchar PortID,void *Buffer,int Count);
  23. int  Port_Send(Uchar PortID,void *Buffer,int Count);
  24. //---------------------------------------------------------------------------------------------
  25. //  Public Faction Code
  26. //---------------------------------------------------------------------------------------------
  27. //---------------------------------------------------------------------------------------------
  28. //  初始化ST16C554
  29. //---------------------------------------------------------------------------------------------
  30. bool Init_16c554(void)
  31. {
  32. uchar xdata *ptr;
  33. uchar i=Init_16c554_Count;
  34. bool Result=false;
  35. while(--i)                                                  // 复位10次不成功,则返回出错
  36. {
  37. _nop_();
  38. reset_16c554 = FREE_RESET;
  39. ms_delay(5);
  40. reset_16c554 = RESET;                                 // 复位16C554
  41. ms_delay(10);                                         // 延时1毫秒
  42. reset_16c554 = FREE_RESET;
  43. ms_delay(10);
  44. ptr = STARTADDR_SERIAL1+SPR;                          // 通道1临时寄存器
  45. *ptr = 0xaa;                                          // 写测试值到临时寄存器
  46. _nop_();
  47. _nop_();
  48. if(*ptr == 0xaa)
  49. {
  50. Result=true;
  51. break;
  52. };//end if
  53. };//end while
  54. for(i=0;i<PortNumber;i++) CommDevice[i].RAMAddress_Map=PORTAddrTABLE[i];
  55. return Result;
  56. }
  57. //---------------------------------------------------------------------------------------------
  58. //    打开串口
  59. //---------------------------------------------------------------------------------------------
  60. void Port_open(Uchar PortID,Uint Baud)
  61. {
  62. uchar xdata *ptr;
  63. ptr = CommDevice[PortID].RAMAddress_Map;                                                // 取端口的基地址
  64. *(ptr+LCR) = LCR_DIV_EN;                                                                // 允许发送波特率
  65. *(ptr+DLM) = (uchar)(Baud>>8);
  66. *(ptr+DLL) = (uchar)Baud;                                                               // 设置默任波特率为19200
  67. *(ptr+LCR) = LCR_WORD_LEN8|LCR_STOP_LEN1;                                               // 设置字长为8,1个停止位,无校验位
  68. *(ptr+FCR) = FIFO_EN|FIFO_TRI_LEVEL_1|FIFO_CLEAR_RCVR|FIFO_CLEAR_XMIT|FIFO_DMA_MODE;    // 设置FIFO 控制寄存器
  69. *(ptr+IER) = IER_TRANSMITHOLD_INT|IER_RECEIVEHOLD_INT;                                  // 设置中断屏蔽寄存器
  70. *(ptr+MCR) = MCR_INTX_EN;                                                               // 允许中断引脚输出
  71. if(PortID==0)   EX0 = true;                         // 开外部中断0(通道1中断)
  72. if(PortID==1)   EX1 = true;                         // 开外部中断1(通道2中断)
  73. if(PortID==2)   EX2 = true;                         // 开外部中断2(通道3中断)
  74. if(PortID==3)   EX3 = true;                         // 开外部中断3(通道4中断)
  75. CommDevice[PortID].CommReceive_Head=0;
  76. CommDevice[PortID].CommReceive_Trail=0;
  77. CommDevice[PortID].CommSend_Head=0;
  78. CommDevice[PortID].CommSend_Trail=0;
  79. CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
  80. }
  81. //---------------------------------------------------------------------------------------------
  82. //       关闭指定的端口
  83. //---------------------------------------------------------------------------------------------
  84. /*void Port_close(Uchar PortID)
  85. {
  86. uchar xdata *ptr;
  87. ptr = CommDevice[PortID].RAMAddress_Map;            // 取端口的基地址
  88. *(ptr+LCR) = LCR_DIV_Dis;                           // 禁止发送波特率
  89. *(ptr+MCR) = MCR_INTX_Dis;                          // 允许中断引脚输出
  90. CommDevice[PortID].CommReceive_Head=0;
  91. CommDevice[PortID].CommReceive_Trail=0;
  92. CommDevice[PortID].CommSend_Head=0;
  93. CommDevice[PortID].CommSend_Trail=0;
  94. CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
  95. if(PortID==0)   EX0 = false;                        // 关外部中断0(通道1中断)
  96. if(PortID==1)   EX1 = false;                        // 关外部中断1(通道2中断)
  97. if(PortID==2)   EX2 = false;                        // 关外部中断2(通道3中断)
  98. if(PortID==3)   EX3 = false;                        // 关外部中断3(通道4中断)
  99. }*/
  100. //--------------------------------------------------------------------------------------------------
  101. //功  能:从串口中接收数据
  102. //返回值:从串口中接收到的数据个数
  103. //参  数:
  104. //        Buffer:接收数的缓冲区
  105. //        Count: 想从串口缓冲区中接收数据个数
  106. //--------------------------------------------------------------------------------------------------
  107. /*int Port_Receive(uchar Port,register void *Buffer,int Count)
  108. {
  109. Uchar Size=0;
  110. if(Port>PortNumber-1)  return Size;
  111. while((Size<Count)&&(ReadPortRecBuf(Port,Buffer)))
  112. {
  113. Size++;
  114. Buffer=Buffer+1;
  115. };//end while
  116. return Size;
  117. }*/
  118. //--------------------------------------------------------------------------------------------------
  119. //功  能:往串口发送数据
  120. //返回值:已发送的数据个数
  121. //参  数:
  122. //        Buffer:发送数据的缓冲区
  123. //        Count: 想从串口发送数据的个数
  124. //--------------------------------------------------------------------------------------------------
  125. int Port_Send(uchar Port,register void *Buffer,int Count)
  126. {
  127. uchar           i=0;
  128. Uchar           Size=0;
  129. uchar xdata     *ptr;
  130. if(Port>PortNumber-1)  return Size;
  131. ptr = CommDevice[Port].RAMAddress_Map;                                                                          // 取端口基地址
  132. while(Size<Count)
  133. {
  134. if(WritePortSendBuf(Port,*((Uchar *)Buffer)))
  135. {
  136. Size=Size+1;
  137. Buffer=Buffer+1;
  138. };//end if
  139. if(CommDevice[Port].Comm_Stu==SERIAL_STU_FREE)
  140. {
  141. for(i=0;(i<FIFO_SIZE)&&(CommDevice[Port].CommSend_Head!=CommDevice[Port].CommSend_Trail);i++)
  142. {
  143. CommDevice[Port].CommSend_Trail=(CommDevice[Port].CommSend_Trail+1)%CommMaxSendBuffer;
  144. *(ptr+THR) = CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Trail];                // 发送数据
  145. };//end for
  146. CommDevice[Port].Comm_Stu = SERIAL_STU_BUSY;
  147. };//end if
  148. };//end while
  149. return Size;
  150. }
  151. //----------------------------------------------------------------------------------------------------
  152. //----------------------------------------------------------------------------------------------------
  153. //私有函数
  154. //----------------------------------------------------------------------------------------------------
  155. //功  能:从串口接收缓冲区中取得数据
  156. //返回值:
  157. //         true:   从缓冲区中成功取得数据
  158. //         false:  从缓冲区中无法取得数据
  159. //参  数: *Byte:从缓冲区中取得数据返回
  160. //-----------------------------------------------------------------------------------------------------
  161. /*bool ReadPortRecBuf(uchar Port,Uchar *Byte)
  162. {
  163. if(CommDevice[Port].CommReceive_Trail==CommDevice[Port].CommReceive_Head)  return false;
  164. *Byte=CommDevice[Port].CommReceiveBuffer[CommDevice[Port].CommReceive_Trail];
  165. CommDevice[Port].CommReceive_Trail=(CommDevice[Port].CommReceive_Trail+1)%CommMaxReceiveBuffer;
  166. return true;
  167. }*/
  168. //-----------------------------------------------------------------------------------------------------
  169. //功  能:往串口发送缓冲区中写数据
  170. //返回值:
  171. //         true:   往缓冲区中写数据成功
  172. //         false:  从缓冲区中写数据失败
  173. //参  数: Byte:  往缓冲区中写入的数据
  174. //------------------------------------------------------------------------------
  175. bool WritePortSendBuf(uchar Port,Uchar Byte)
  176. {
  177. if((CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer==CommDevice[Port].CommSend_Trail) return false;
  178. CommDevice[Port].CommSend_Head=(CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer;
  179. CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Head]=Byte;
  180. return true;
  181. }
  182. //--------------------------------------------------------------------------------
  183. // 外部扩展串行口1中断处理程序(外部中断0)
  184. //--------------------------------------------------------------------------------
  185. void serial1_int() interrupt 0
  186. {
  187. uchar xdata *ptr;
  188. uchar event;
  189. uchar port;
  190. port =  CHANL1_PORT;
  191. ptr =   CommDevice[port].RAMAddress_Map;                                                // 读ISR 中断状态寄存器
  192. event = *(ptr+ISR)&0x0f;                                                                // 读最高优先级别的中断码
  193. _nop_();
  194. switch(event)
  195. {
  196. case EVENT_RXRDY:                                                               // 接受数据到中断
  197. case EVENT_RXRDY_TIMEOUT:
  198. for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
  199. {
  200. CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
  201. if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
  202. CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
  203. }; //end for
  204. break;
  205. case EVENT_TXRDY:                                                               //发送数据中断
  206. if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)         //判断数据包是否发送完毕
  207. {
  208. for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
  209. {
  210. CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
  211. *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
  212. };//end for
  213. CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
  214. }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
  215. break;
  216. };//end switch
  217. }
  218. //--------------------------------------------------------------------------------
  219. // 外部扩展串行口2中断处理程序(外部中断2)
  220. //--------------------------------------------------------------------------------
  221. void serial2_int() interrupt 2
  222. {
  223. uchar xdata *ptr;
  224. uchar event;
  225. uchar port;
  226. port =  CHANL2_PORT;
  227. ptr =   CommDevice[port].RAMAddress_Map;                                                //读ISR 中断状态寄存器
  228. event = *(ptr+ISR)&0x0f;                                                                //读最高优先级别的中断码
  229. _nop_();
  230. switch(event)
  231. {
  232. case EVENT_RXRDY:                                                               //接受数据到中断
  233. case EVENT_RXRDY_TIMEOUT:
  234. for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
  235. {
  236. CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
  237. if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
  238. CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
  239. }; //end for
  240. break;
  241. case EVENT_TXRDY:                                                               //发送数据中断
  242. if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)         //判断数据包是否发送完毕
  243. {
  244. for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
  245. {
  246. CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
  247. *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
  248. };//end for
  249. CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
  250. }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
  251. break;
  252. };//end switch
  253. }
  254. //--------------------------------------------------------------------------------
  255. // 外部扩展串行口3中断处理程序(外部中断6)
  256. //--------------------------------------------------------------------------------
  257. void serial3_int () interrupt 6
  258. {
  259. uchar xdata *ptr;
  260. uchar event;
  261. uchar port;
  262. port =  CHANL3_PORT;
  263. ptr =   CommDevice[port].RAMAddress_Map;                                            // 读ISR 中断状态寄存器
  264. event = *(ptr+ISR)&0x0f;                                                            // 读最高优先级别的中断码
  265. _nop_();
  266. switch(event)
  267. {
  268. case EVENT_RXRDY:                                                           // 接受数据到中断
  269. case EVENT_RXRDY_TIMEOUT:
  270. for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
  271. {
  272. CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
  273. if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
  274. CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
  275. }; //end for
  276. break;
  277. case EVENT_TXRDY:                                                           //发送数据中断
  278. if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)     //判断数据包是否发送完毕
  279. {
  280. for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
  281. {
  282. CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
  283. *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
  284. };//end for
  285. CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
  286. }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
  287. break;
  288. };//end switch
  289. }
  290. //--------------------------------------------------------------------------------
  291. // 外部扩展串行口4中断处理程序(外部中断7)
  292. //--------------------------------------------------------------------------------
  293. void serial4_int () interrupt 7
  294. {
  295. uchar xdata *ptr;
  296. uchar event;
  297. uchar port;
  298. port =  CHANL4_PORT;
  299. ptr =   CommDevice[port].RAMAddress_Map;                                            // 读ISR 中断状态寄存器
  300. event = *(ptr+ISR)&0x0f;                                                            // 读最高优先级别的中断码
  301. _nop_();
  302. switch(event)
  303. {
  304. case EVENT_RXRDY:                                                               // 接受数据到中断
  305. case EVENT_RXRDY_TIMEOUT:
  306. for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
  307. {
  308. CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
  309. if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
  310. CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
  311. }; //end for
  312. break;
  313. case EVENT_TXRDY:                                                               //发送数据中断
  314. if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)         //判断数据包是否发送完毕
  315. {
  316. for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
  317. {
  318. CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
  319. *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
  320. };//end for
  321. CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
  322. }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
  323. break;
  324. };//end switch
  325. }
  326. //--------------------------------------------------------------------------------
 

16V554 的测试代码的更多相关文章

  1. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

  2. mysql锁 实战测试代码

    存储引擎 支持的锁定 MyISAM 表级锁 MEMORY 表级锁 InnoDB 行级锁 BDB 页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低.行级锁:开销 ...

  3. 使用Microsoft Fakes隔离测试代码

    在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...

  4. iOS开发:XCTest单元测试(附上一个单例的测试代码)

    测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...

  5. 在内核中异步请求设备固件firmware的测试代码

    在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...

  6. x264测试代码

    建立一个工程,将头文件,库文件加载到工程,测试代码如下:#include <iostream>#include <string>#include "stdint.h& ...

  7. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  8. Git合并开发代码分支到测试代码分支

    ——转载请注明出自天外归云的博客园 用TortoiseGit下载代码到本地 首先需要在本机安装好TortoiseGit.然后在随便哪个路径下比如D盘,右键“Git Clone”: 然后URL处选择项目 ...

  9. mvn编写主代码与测试代码

    maven编写主代码与测试代码 3.2 编写主代码 项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包.默认情况下,Maven假设项目 ...

随机推荐

  1. idea maven 报-source 1.5 中不支持 diamond 运算符

    需要修改 project setting 中的

  2. Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境

    在给一个客户做的系统上,因为要对数据库进行查看,但之前都是用TeamView来连接到客户的服务器进行数据库操作的 但最近客户那边的TeamView好像更改过密码导致我无法正常连接,而巧了客户的网官因为 ...

  3. Java中字符串相等与大小比較

    在C++中,两个字符串比較的代码能够为: (string1==string2) 但在java中,这个代码即使在两个字符串全然同样的情况下也会返回false Java中必须使用string1.equal ...

  4. 利用Nginx搭建http和rtmp协议的流媒体服务器[转]

    利用nginx搭建http和rtmp协议的流媒体服务器 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtmp协议:同时打开rtmp的hls功能资料:HTTPLive Streaming( ...

  5. 算法笔记_045:币值最大化问题(Java)

    目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻 ...

  6. CentOS如何安装linux桌面?

    CentOS如何安装linux桌面? 以前默认安装分centos没有图形界面,今天想用下, yum groupinstall "GNOME Desktop" "Graph ...

  7. C++(一)——HelloWorld

    之前学C.学Python,学的比較多的是Java,作为大家口中更强大的C++,要学学,这次的话,以了解主要的特性和做个小游戏作为目标吧. 1)HelloWorld Eclipse执行C++之Launc ...

  8. Unity3D入门工具介绍(一)

    1.UnitySetup-4.1.2.exe安装包 2unity.pro.4.1.2.patch-MPT.exeUnity3D破解补丁  关于Unity3d 可以看下这个 http://book.2c ...

  9. Git高速入门——Git安装、创建版本号库以及经常使用命令

    学习Git最全面的资料,在我看来是这本书--Pro Git,网上关于Git的教程有非常多,包含当中一些非常优秀的教程.这一系列的博客,主要是记录自己学习Git的经历.以及在这一过程中遇到的一些问题. ...

  10. 旧文备份:简单CANOpen 协议说明

    (十年前的旧文,不舍等扔) 创建日期:2005-11-17 修改日期:2005-11-17 文件名称:简单CANOpen 协议说明.doc 作者:winshton 版本:V1.0 (注:本文以24in ...