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

  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. //--------------------------------------------------------------------------------
 

最新文章

  1. AngularJS之中级Route【二】(七)
  2. nginx搭建笔记
  3. oracle 常用sql
  4. Linux 账户信息显示和实现账户安全
  5. plsql如果表和函数等显示不出来
  6. 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件
  7. asp.net获取当前页面文件名,参数,域名等方法。统一session验证和权限验证的方法
  8. android的数据存储方式
  9. 动态规划-Burst Balloons
  10. mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)
  11. 深入浅出Koa
  12. zabbix_server----邮箱报警
  13. Web前端新学
  14. proxmox网络
  15. 极验3.0滑动拼图验证的使用--java
  16. layui(七)——rate组件常见用法总结
  17. 20165220 Java第五周学习总结
  18. postgresql-日志表
  19. 管道限流利器pv
  20. springmvc DispatchServlet初始化九大加载策略(三)

热门文章

  1. JQuery中attr属性和jQuery.data()学习笔记
  2. STL - 常用关联容器代码 - set &amp; multiset
  3. python 利用 setup.py 手动安装第三方类库
  4. Eclipse Kepler 设置中文编码 和 汉化
  5. python发送邮件实例1
  6. vlc模块间共享变量
  7. LInux下inode空间报警-CROND出错导致/var/spool/postfix/maildrop/堆积
  8. 一个模块包含多目录和源文件,Makefile写法
  9. myql基准测试工具Sysbench
  10. PHP-Yii执行流程分析(源码)