GSM_430.C
上传用户:zanguozi01
上传日期:2014-02-19
资源大小:155k
文件大小:25k
源码类别:

GPS编程

开发平台:

Others

  1. /* 主程序修改说明记录
  2. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3. 2005年6月20日:
  4. 程序文件说明:
  5. 根据新制作的PCB图(GPS-M22:V2.4)版本的原理图,此程序为对应的系统文件
  6. 程序版本号:V2.32
  7. 程序功能说明:
  8. 1,增加外部的SRAM,用于接收外接部件的大量数据的传输(增加W24L011AJ(128K),实际使用64K),锁存器74HC573。
  9. 2,串口的分配: 串口0 M22
  10.   串口1 外接部件(调试串口)
  11.   串口2 GPS
  12.   串口3 车载电话
  13.   串口4 显示终端
  14. 3,主要实现功能:
  15. (1),与行使记录仪之间的交互通讯
  16. (2),
  17. (3),
  18. (4),
  19. (5),
  20. 详细说明与行使记录仪之间的通讯流程:
  21. 主控向记录仪发送的数据有: 1,每一秒种发送8个字节的经,纬度,(用于记录仪存储和运算)(记录仪不用给出ECHO)
  22. 2,每隔1个小时发送一个查询当前记录仪时间,如果判断记录仪的时间和GPS的时间误差超过1秒,此时记录仪显示车辆速度为0,则发送矫正时间参数)
  23.    记录仪需要给出ECHO
  24. 3,主控接收到中心设置超速的限制值的参数设置(转发给记录仪)(记录仪需要给出ECHO)
  25. 4,主控接收到中心设置间隔距离的限制值的参数设置(转发给记录仪)(记录仪需要给出ECHO)
  26. 5,主控接收到中心设置疲劳驾驶的时间限制值的参数设置(转发给记录仪)(记录仪需要给出ECHO)
  27. 记录仪表向主控发送的数据有:1,记录仪接收到主控的查询当前时间命令,则返回当前记录仪的时间和当前速度的值
  28. 2,如果车辆速度超过设置的报警警戒值,则记录仪上发超速报警的信息,每间隔2秒发送一次,直至主控收到后返回响应,则停止发送超速报警信息
  29.    如果记录仪在超速的状态下,判断不处于超速,则主动发送停止超速的的信息,直至主控收到后返回响应
  30. 3,如果属于疲劳驾驶的状态下,记录仪应该向主控发送一个信息
  31. 4,车辆行使状态下,根据数据上报的类型(按时间上报数据点,按距离上报数据点...)如果属于按距离上报数据点,则如果记录仪表每判断到一个间隔
  32.    距离,则需要向主控发送一个信息
  33. 主控查询大量记录仪数据的通讯形式:中心下发一个查询记录仪大量数据的下行命令,主控转发给记录仪,记录仪则分批读取数据发送给主控
  34.   主控先负责接收数据,每接收一包数据,先判断是否属于部分数据包,如果是,则将有效数据提取出来,依次存储在外部的扩展SRAM里。然后给出一个
  35.   接收到此数据包的响应,然后等待接收记录仪的下一个数据包。直至接收到记录仪发送过来的此数据全部转发完成的信息,则主控开始进行外部SRAM的数据
  36.   转发(TCP方式)]
  37.   所有的中心的查询命令和设置命令,主控均不做命令字的检验,,主控接收记录仪的所有命令的回应包括设置的响应,或者数据返回
  38. 2005年8月30日
  39. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  40. */
  41. /********************************************************
  42. 系统程序结构的说明:
  43. 1,FLASH的分配
  44. 扇区0-----暂停使用
  45. 扇区1,2---作为存储目标号码,IP地址和端口号(双备份)
  46. 扇区3,4---作为电话号码的存储
  47. 扇区5,6---作为上传数据间隔,开关量等等的存储(双备份)
  48. 2,串口的分配
  49. 串口0 M22
  50.   串口1 外接部件(调试串口)
  51.   串口2 GPS
  52.   串口3 车载电话
  53.   串口4 显示终端
  54. 3, SRAM的分配
  55. 1,串行存储器的两个264byte的SRAM的分配buffer1,buffer2,
  56. buffer1的分配:与原来的程序保持一致(不变),具体细节见相关地方
  57. buffer2的使用用来存储读取的相关页的数据
  58. 2,外部64K的SRAM的分配
  59.    0-----60K 作为接收外部数据(以行使记录仪为例)大量数据的接收(在串口1的中断子程序中处理接收)
  60.    61K---64K 作为存储记录仪需要向显示终端发送数据的缓冲存储(暂时这么考虑)
  61. 3,MSP430F149的内部SRAM的分配
  62. 4,TCP数据的发送方式和类别
  63. 根据以前的TCP数据的方式发送方式,现在将发送的数据分位如下几类:
  64. A, 存储在buffer1相关区域的上行数据(包括手柄,和显示终端需要上行的相关信息,和对一些下行命令的响应信息)
  65. B, 存储在周期数据缓冲区gCircle_Buffer[]中有需要发送的数据(主要存储的是周期发送的报警信息和行车轨迹信息)
  66. C, TCP在线状态下的握手信息数据的定时发送主要以发FF 0D数据
  67. D, 发送外接部件的数据(以存储在外部的SRAM的数据区域)
  68. 5,显示终端和手柄终端的接收和发送缓冲区的说明
  69. 手柄和显示屏与主控系统通讯均是采用的模拟串口3,和4。属于半双工的形式,故在向终端发送数据的时候需要判断是否在接收数据。
  70. 接收手柄的数据缓冲:gHandle_Buffer[30]
  71. 向手柄的发送数据的缓冲:保持与原来的兼容,是在需要向手柄发送数据的时候才组织数据发送(以节省SRAM的空间)
  72. 接收显示屏数据缓冲:gDisp_Buffer_R[50]
  73. 向显示屏的发送数据的缓冲:gDisp_Buffer[256]
  74. 6,与外接部件的数据通讯的接收和发送缓冲说明(以记录仪为例)
  75. 接收外接部件的数据缓冲:外部SRAM(0---64K)
  76. 向外接部件发送的数据缓冲:
  77. 修改记录:
  78. 2005年8月23日:
  79. ACC关闭后20分钟,TCP下线,将按30分钟的方式传送数据。1个小时关闭模块
  80. ACC关闭后20分钟 ,如果ACC再次开启,则重新启动程序
  81. 行车轨迹只可以最少10分钟的SMS的补偿,报警信息可以允许GSM方式传送
  82. 手柄通讯方式的改变
  83. 重点监控制:中心下行监控命令,则改变工作状态为监控方式,则上传数据的不受ACC开和关闭的控制
  84. 并且,不管时间间隔多大,均采用TCP常连线的方式。重点监控的方式是数传方式的改变
  85. 但此状态方式并不存储在FLASH中,同时,即使ACC关闭,在开启的时候,也不允许重新
  86. 启动程序。直到重点监控结束。数传的方式改变。
  87. 2005年9月1日:
  88. 增加通过手柄接口设置参数的部分,APN,电话号码本
  89. 调试一些线路报警的算法
  90. 2005年9月5日:
  91. 线路偏离的算法正确验证
  92. 增加如果ACC开启状态下,持续12个小时,则会将MCU重新启动一次。以恢复设备状态
  93. 此功能是为了防止在实际接线中,施工时候直接将ACC接在常电上的一个自恢复保护措施
  94. 2005年9月6日:
  95. 完善线路偏离报警的算法(但线路数据通过中心并没完成设置)
  96. 通过手柄端口设置电话号码完成
  97. 通过手柄端口参数设置完善(增加了APN的设置,按距离上传的距离值设置,)
  98. 2005年9月8日:
  99. 通过手柄端口设置显示终端的短信预置完成
  100. 2005年9月14日:
  101. 根据要求修改上报数据的补偿方式(短消息)
  102. 1,被劫报警的上报方式的修改
  103. 2005年9月22日:实际跑车进行线路报警的完善
  104. 2005年10月9日:
  105. 1,针对电话方面的恢复处理
  106. 2,针对疲劳报警或者预警的误报处理
  107. 根据在现场实际应用中发现的情况,以后需要完善的几点:
  108. A;因为手柄和显示终端是半双工通讯,并且均为模拟串口的方式,在需要将232的IC改换为3232的同时,
  109. 为了增加通讯的可靠性,则需要针对部分指令的响应处理.
  110. 2005年10月16日:
  111. 1,针对模拟串口的发送和接收时候,需要停止某些中断
  112. 2,增加对MSP430内部的两个信息存储器的利用。分别为128个字节,作为存储备份参数利用
  113.   信息存储器A,备份扇区1和扇区2的前128字节的数据
  114.   信息存储器B,备份扇区3和扇区4的前128字节的数据
  115.   如果开机检测扇区1和扇区2,均是校验核不正确的扇区数据,则需要将信息存储器A中的前128个字节读出,并重新计算校验核
  116.   存储在扇区1或者扇区2中。
  117.   同样道理,信息存储器B是对应的扇区3和扇区4
  118. 3,每次更新或者从新计算扇区1和2的时候需要及时的更新信息存储器A
  119. 每次更新或者重新计算扇区3和4的时候需要及时的更新信息存储器B:
  120. 暂时未完成测试
  121. 2005年10月17日:
  122. OK    **1,为了减少串行FLASH的操作(包括串行FLASH中的SRAM的操作,则将以前存储在buffer1中的数据转移到外部的SRAM中)
  123. 3,根据硬件PCB的改进,增加对外部串行FLASH的WP管脚的控制(预防对FLASH的操作损坏)
  124. 4,针对场强信号的发送,改为每间隔一定时间发送场强信号,而不是在查询CSQ后才发送场强指令OK
  125. 5,如果M22处于电话状态下,则需要每间隔一定时间查询CLCC指令 OK
  126. 2005年10月19日:
  127. 1,增加进行测试外部SRAM的指令()完成测试OK
  128. 2,增加主控主动挂机指令的接收手柄的响应,如果2秒内未接收到手柄的挂机指令响应,则重复发送
  129. 重复5次,则丢弃此包(还未调试)
  130. 3,将对手柄需要发送的的数据存储在外部SRAM中。改变原来向手柄发送指令随时发送的结构模式
  131. 取消所有对buffer1的操作
  132. 14,因为每次在发送数据和登陆TCP前,均有个验证中心号码和目标号码等参数的有效性,需要是对外部SRAM进行操作
  133. 频繁的操作可能引起外部FLASH内容的丢失,则这里改为每30分钟进行所有的验证,如果严整正确,则设置
  134. 一个标志,如果失败,则立刻进行数据的重装工作
  135. 2005年11月3日
  136. 1,根据在MSP430内部的两个信息扇区,取消对信息扇区数据的校验核的计算,取代的是最后一个字节存储0XAA,
  137. 只表示此信息扇区存储过数据。如果在检验外部FLASH的两个扇区的数据均不正确的情况下
  138. 则需要将两个信息扇区的数据覆盖到外部的FLASH中
  139. 2005年11月8日:
  140. 1,增加定位查询的可靠信,如果在接收到一个短消息(属于定位查询),并且,设备工作在
  141. GSM的工作方式下,并且目标号码属于无效的状态,则需要暂时提取这个短消息号码中的
  142. 号码,然后作为暂时的目标号码存储起来,在发送定位数据的时候则以此目标号码为准。
  143. 2005年11月16日:
  144. 1,取消每次系统程序上电后,查询记录仪驾驶员代码的操作
  145. 2005年11月19日
  146. 1,精简程序,减少AD转换判断部分,增加对FLASH的可靠操作,尤其是对电话号码存储部分的操作
  147. 2005年11月21日
  148. 1,完善参数设置方面的尤其是APN方面的处理,增加对buffer2的处理机制
  149. 2005年11月23日
  150. 1,针对山东市场的一体机,默认电话始终处于开启状态
  151. 2005年12月1日:
  152. 1,针对在测试过程中,出现的模拟串口失效的问题,则增加了个几个恢复(重新对TA定时器进行初始化)
  153. 2005年12月3日:
  154. 1,针对如果外部的晶振如果暂时的失效,则会严重影响三个模拟串口的接收,则采用系统程序重新启来恢复
  155. 2005年12月4日:
  156. 1,针对外部晶振XT2的暂时失效,则增加对外部晶振XT2的失效中断处理程序
  157. 2005年12月8日:
  158. 在前面版本的一体机的程序结构下,需要进行部分程序结构的修改,使得符合一体机的概念,就是将GPS
  159. 工作部分和记录仪的工作部分能够在任何一个还没工作正常下,双方能互相不干扰和影响,即GSM模块在
  160. 进行初始化或者正在初始化的过程中,并不影响记录仪的工作和显示屏的工作
  161. 2005年12月27日:
  162. 根据以前存在接收记录仪数据的方式有可能判断不到正确的数据包,现在将接收记录仪数据的方式进行改进
  163. ********************************************************/
  164. /********************************************************
  165. * 文件名:  GSM_430.C
  166. * 创建时间:2004年12月7日
  167. * 创建人:        
  168. * 版本号:  1.00
  169. * 功能:   系统主程序框架
  170. * 文件属性:公共文件
  171. * 修改历史:(每条详述)
  172. ********************************************************/
  173. #include <msp430x14x.h>
  174. #include <math.h>
  175. #include "TA_Uart.h"
  176. #include "SPI45DB041.h"
  177. #include "W_Protocol.h"
  178. #include "Handle_Protocol.h"
  179. #include "Uart01.h"
  180. #include "M22_AT.h"
  181. #include "Define_Bit.h"
  182. #include "D_Buffer.h"
  183. #include "Other_Define.h"
  184. #include "General.h"
  185. #include "Main_Init.h"
  186. #include "Sub_C.h"
  187. #include "Check_GSM.h"
  188. #include "Do_Reset.h"
  189. #include "Do_M22.h"
  190. #include "Do_Handle.h"
  191. #include "Do_GPS.h"
  192. #include "Do_Disp.h"
  193. #include "Do_Other.h"
  194. #include "Do_SRAM.h"
  195. #include "Do_Record.h"
  196. #include "Record_Protocol.h"
  197. #include "Msp430_Flash.h"
  198. /*
  199. #include "Disp_Protocol.h"
  200. */
  201. //#define Debug_GSM_COM1
  202. unsigned int i;
  203. unsigned int  Z_Timer=0;
  204. unsigned int  Debug_Timer=0;
  205. /********************************************************
  206. * 函数名:main.c
  207. 作用域:本地文件调用
  208.         作为主框架程序
  209. * 功能: 项目主函数,系统的循环运行
  210. * 参数:
  211. * 返回值:
  212. * 创建人:
  213. *
  214. * 修改历史:(每条详述)
  215. ********************************************************/
  216. void main(void)
  217. {
  218.     //看门狗定时器WDT的设置:
  219. WDTCTL=WDTPW+WDTHOLD;   //关闭看门狗WDT  ,WDTPW看门狗的口令
  220.     //时钟模块的设置:
  221.     BCSCTL2|=SELS+SELM1;    //SELS表示用XT2CLK作为SMCLK的时钟源
  222.                             //SELM1表示用XT2CLK作为MCLK时钟源
  223.                             //ACLK---辅助时钟,用于软件选择分频因子,也可用软件选做各外围模块的时钟信号
  224.                             //MCLK---主时钟,主要用于CPU和系统,也可软件选择分频因子
  225.                             //SMCLK--子时钟,由软件选择用于外围模块
  226. // BCSCTL2|=DIVS_3; //选择SMCLK时钟的分频因子为8
  227. // BCSCTL2|=DIVM_3; //选择MCLK时钟的分频因子为8
  228. //-------------------------------
  229.     do
  230.     {
  231. IFG1 &= ~OFIFG;             // Clear OSCFault flag
  232. for (i = 0xFF; i > 0; i--); // Time for flag to set
  233. for (i = 0xFF; i > 0; i--);
  234.     }
  235.     while ( IFG1 & OFIFG ); // OSCFault flag still set?
  236. //--------------------------------
  237.     for (i = 60000; i > 0; i--);
  238.   //定时器TA的设置
  239.     TACTL|=TASSEL1;         //输入时钟选择MCLK
  240.     TACTL|=TACLR;           //定时器A清除位CLR清零
  241.     TACTL|=MC1;             //定时器A选择连续增记数模式
  242. //    TACTL|=TAIE;          //定时器A溢出中断允许
  243.     TAR=0;                  //定时器A的值清零
  244.     TACCTL0|=OUT;           //TXD2 Idle as Mark
  245. TACCTL1|=OUT;           //TXD3 Idle as Mark
  246. TACCTL2|=OUT;           //TXD4 Idle as Mark
  247.   //定时器TB的设置
  248.     TBCTL|=TBSSEL1;         //输入时钟源选择MCLK
  249.     TBCTL|=TBCLR;           //定时器B清除位CLR清零
  250.     TBCTL|=MC1;             //模式为连续增记数
  251. //    TBCTL|=TBIE;          //定时器B溢出中断允许
  252.     TBR=0;                  //寄存器B的值清零
  253.     TBCCTL0|=CCIE;
  254. /*
  255. =============================================================================
  256.                              波特率的计算方式
  257.           8000 000 /19200=416.6667D(十进制)=01A0H+