nodelink_slave_app.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "nodelink_slave_app.h"
  2. #include "board.h"
  3. #include "DataHelper.h"
  4. #include "io_app.h"
  5. #include "NodeLinkSlave.h"
  6. #include "NodeLinkCommon.h"
  7. nodelink_slave_t slave; //扩展模块从站数据结构
  8. int slave_bytes_count = 0;
  9. int check_error_count = 0;
  10. int recv_bytes_missing = 0;
  11. int total_packed = 0;
  12. int nl_recv_master_step = 0; //接收主站步骤
  13. static int nl_recv_slave_step = 0; //接收从站步骤
  14. static int nl_send_step = 0; //发送步骤
  15. static int nl_send_step1 = 0; //发送步骤
  16. unsigned char master_data_buffer[256];
  17. unsigned char master_data_buffer1[256];
  18. unsigned char slave_data_buffer[256];
  19. unsigned char recv_master_buffer[256];
  20. unsigned char recv_slave_buffer[256];
  21. unsigned char send_buffer[256];
  22. unsigned char send_buffer1[4];
  23. int transfersize;
  24. int transfersize1;
  25. int txcount;
  26. int txcount1;
  27. fifo_buffer_t fifo;
  28. extern sw_timer_t send_timer;
  29. extern unsigned char receive_master_flag;
  30. extern unsigned char receive_master_flag1;
  31. extern unsigned char receive_slave_flag;
  32. extern unsigned short master_rxlen;
  33. extern unsigned short master_rxlen1;
  34. extern unsigned short slave_rxlen;
  35. extern unsigned char MissCount;
  36. extern unsigned char DebugSendFlg;
  37. extern unsigned char LifeSignal;
  38. extern unsigned char LastLifeSignal;
  39. sw_timer_t error_timer;
  40. sw_timer_t err_reset_timer;
  41. extern sw_timer_t decode_err_timer;
  42. extern unsigned long errcnt;
  43. extern unsigned char BeginRecvFlg;
  44. extern unsigned char RecvErrFlg;
  45. fifo_buffer_t Rxfifo;
  46. /**
  47. * 端口数据下发,用于主串口进入的数据往副串串口发
  48. *
  49. * @author lxz (070120 11:26:38)
  50. *
  51. * @param dat
  52. */
  53. static void nodelink_slave_port_down(unsigned char dat) {
  54. //hw_dma_uart_write_byte(0, dat);
  55. }
  56. /**
  57. * 从站接收主站数据处理
  58. * @author lxz (070120 12:03:56)
  59. *
  60. * @param dat
  61. * @param len
  62. *
  63. * @return int
  64. */
  65. static void nodelink_slave_on_recv(nodelink_slave_t * slave, unsigned char * data_in, int len) {
  66. switch (slave->model) {
  67. case 0x01://IO扩展类型
  68. io_outputs[0].value = data_in[0];
  69. break;
  70. }
  71. }
  72. /**
  73. * 从站接收主站数据处理
  74. * @author lxz (070120 12:03:56)
  75. *
  76. * @param dat
  77. * @param len
  78. *
  79. * @return int
  80. */
  81. static int nodelink_slave_on_send(nodelink_slave_t * slave, unsigned char * data_out) {
  82. int len=0;
  83. switch (slave->model) {
  84. case 0x01://IO扩展类型
  85. data_out[0] = io_inputs[0].value;
  86. len=1;
  87. break;
  88. }
  89. return len;
  90. }
  91. static void nodelink_slave_event(char cmd, int len) {
  92. switch (cmd) {
  93. case NL_SLAVE_EVENT_RESET:
  94. slave_bytes_count = 0;
  95. break;
  96. case NL_SLAVE_EVENT_SETID:
  97. total_packed = 0;
  98. check_error_count = 0;
  99. recv_bytes_missing = 0;
  100. break;
  101. case NL_SLAVE_EVENT_CRCERROR:
  102. check_error_count++;
  103. break;
  104. }
  105. }
  106. //扩展协议硬件相关接口
  107. static nodelink_slave_ops slave_ops = {
  108. nodelink_slave_port_down,
  109. nodelink_slave_on_recv,
  110. nodelink_slave_on_send,
  111. nodelink_slave_event
  112. };
  113. /**
  114. * 初始化扩展模块协议与端口
  115. *
  116. * @author lxz (063020 16:07:37)
  117. *
  118. * @param void
  119. */
  120. void nodelink_slave_app_init(void) {;
  121. //为上行数据申请先入先出缓冲
  122. dh_fifo_init(&fifo, 20);
  123. dh_fifo_init(&Rxfifo, 5);
  124. nodelink_slave_init(&slave, 1, &slave_ops);
  125. {
  126. int value = 2000;
  127. //hw_dma_uart_control(1, UART_CTRL_SET_RDFIN_TIME, &value);
  128. }
  129. nodelink_slave_reset(&slave);
  130. sw_timer_start(&error_timer, 5, 0);
  131. BeginRecvFlg=0;
  132. RecvErrFlg=0;
  133. }
  134. /**
  135. * 扩展模块执行主程序
  136. *
  137. * @author lxz (063020 16:10:05)
  138. *
  139. * @param void
  140. */
  141. void nodelink_slave_app_run(void) {
  142. int length = 0;
  143. static unsigned long timeout;
  144. //接收主站数据
  145. if(receive_master_flag)
  146. {
  147. if(BeginRecvFlg==0)
  148. {
  149. BeginRecvFlg=1;
  150. sw_timer_start(&decode_err_timer, 0, 100000);
  151. }
  152. nodelink_slave_recv_master(&slave, master_data_buffer, master_rxlen);
  153. sw_timer_start(&error_timer, 5, 0);
  154. sw_timer_start(&err_reset_timer, 0, 100000);
  155. if(slave.bus_status == 0xF1)
  156. {
  157. run_led_speed=500000;
  158. }
  159. else
  160. {
  161. run_led_speed=100000;
  162. }
  163. }
  164. if(receive_master_flag1)
  165. {
  166. nodelink_slave_recv_master(&slave, master_data_buffer1, master_rxlen1);
  167. receive_master_flag1=0;
  168. }
  169. if (sw_timer_expire(&error_timer))
  170. {
  171. run_led_speed=2000000;
  172. }
  173. if (BeginRecvFlg==1 && sw_timer_expire(&err_reset_timer))
  174. {
  175. RecvErrFlg=1;
  176. }
  177. //接收从站数据
  178. if(receive_slave_flag)
  179. {
  180. nodelink_slave_recv_slave(&slave, slave_data_buffer, slave_rxlen);
  181. }
  182. //超时没有接收到从站信息,说明自己是最后一块板
  183. if (slave.bus_status == 0xF0 && (slave.step == 1) && sw_timer_expire(&send_timer))
  184. {
  185. slave.id=1;
  186. slave.step=6;
  187. slave.count = 100;
  188. }
  189. //发送数据
  190. if((RESET != usart_flag_get(USART1, USART_FLAG_TC)) && (txcount==transfersize))
  191. {
  192. txcount=0;
  193. transfersize = nodelink_slave_send(&slave, send_buffer);
  194. if(transfersize>0)
  195. {
  196. usart_data_transmit(USART1, send_buffer[txcount++]);
  197. usart_interrupt_enable(USART1, USART_INT_TBE);
  198. }
  199. }
  200. //发送数据
  201. // if((RESET != usart_flag_get(USART0, USART_FLAG_TC)) && (txcount1==transfersize1))
  202. // {
  203. // if(DebugSendFlg)
  204. // {
  205. // errcnt++;
  206. // DebugSendFlg=0;
  207. // send_buffer1[0]=0xEE;
  208. // send_buffer1[1]=MissCount;
  209. // send_buffer1[2]=LifeSignal;
  210. // send_buffer1[3]=errcnt;
  211. // transfersize1=4;
  212. // }
  213. // else
  214. // {
  215. // transfersize1=0;
  216. // txcount1=0;
  217. // }
  218. // if(transfersize1>0)
  219. // {
  220. // txcount1=0;
  221. // usart_data_transmit(USART0, send_buffer1[txcount1++]);
  222. // usart_interrupt_enable(USART0, USART_INT_TBE);
  223. // }
  224. // }
  225. // switch (nl_send_step) {
  226. // case 0:
  227. // length = nodelink_slave_send(&slave, send_buffer);
  228. // if (length > 0) {
  229. // hw_dma_uart_begin_write(1, (const char *)send_buffer, length);
  230. // nl_send_step++;
  231. // }
  232. // break;
  233. // case 1:
  234. // if (hw_dma_uart_write_finish(1))
  235. // {
  236. // nl_send_step = 0;
  237. // }
  238. // break;
  239. //
  240. // }
  241. //
  242. // //发送串口调试数据
  243. // switch (nl_send_step1) {
  244. // case 0:
  245. // if(DebugSendFlg)
  246. // {
  247. // errcnt++;
  248. // DebugSendFlg=0;
  249. // send_buffer1[0]=0xEE;
  250. // send_buffer1[1]=MissCount;
  251. // send_buffer1[2]=LifeSignal;
  252. // send_buffer1[3]=errcnt;
  253. // hw_dma_uart_begin_write(0, (const char *)send_buffer1, 4);
  254. // nl_send_step1++;
  255. // }
  256. // break;
  257. // case 1:
  258. // if (hw_dma_uart_write_finish(0))
  259. // {
  260. // nl_send_step1 = 0;
  261. // }
  262. // break;
  263. //
  264. // }
  265. }