Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

Committer:
jmarkel44
Date:
Tue Jan 24 19:05:33 2017 +0000
Revision:
0:61364762ee0e
Port from IAR to Nucleo-F412 board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:61364762ee0e 1 // modbus
jmarkel44 0:61364762ee0e 2 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 3 // includes
jmarkel44 0:61364762ee0e 4
jmarkel44 0:61364762ee0e 5 #include "mbed.h"
jmarkel44 0:61364762ee0e 6 #include "global.h"
jmarkel44 0:61364762ee0e 7 #include "mod.h"
jmarkel44 0:61364762ee0e 8
jmarkel44 0:61364762ee0e 9 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 10 // globals
jmarkel44 0:61364762ee0e 11
jmarkel44 0:61364762ee0e 12 unsigned short int mod_data[MOD_DATA];
jmarkel44 0:61364762ee0e 13 unsigned short int mod_ireg[MOD_IREG];
jmarkel44 0:61364762ee0e 14
jmarkel44 0:61364762ee0e 15 int mod_verbose = 0;
jmarkel44 0:61364762ee0e 16
jmarkel44 0:61364762ee0e 17 // -------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 18 // modbus buffers
jmarkel44 0:61364762ee0e 19
jmarkel44 0:61364762ee0e 20 #define MOD_RXNUM 200
jmarkel44 0:61364762ee0e 21 #define MOD_TXNUM 200
jmarkel44 0:61364762ee0e 22
jmarkel44 0:61364762ee0e 23 int mod_rxnum = 0;
jmarkel44 0:61364762ee0e 24 int mod_txnum = 0;
jmarkel44 0:61364762ee0e 25
jmarkel44 0:61364762ee0e 26 unsigned char mod_rxbuf[MOD_RXNUM];
jmarkel44 0:61364762ee0e 27 unsigned char mod_txbuf[MOD_TXNUM];
jmarkel44 0:61364762ee0e 28
jmarkel44 0:61364762ee0e 29 // -------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 30 // print functions
jmarkel44 0:61364762ee0e 31
jmarkel44 0:61364762ee0e 32 void print_uc(char hex, char bin, char dec, char* pre, unsigned char input, char* post)
jmarkel44 0:61364762ee0e 33 {
jmarkel44 0:61364762ee0e 34 if(pre[0] != 0) printf("%s", pre);
jmarkel44 0:61364762ee0e 35
jmarkel44 0:61364762ee0e 36 if(hex)
jmarkel44 0:61364762ee0e 37 {
jmarkel44 0:61364762ee0e 38 printf("0x%02X", input);
jmarkel44 0:61364762ee0e 39 }
jmarkel44 0:61364762ee0e 40 if(bin)
jmarkel44 0:61364762ee0e 41 {
jmarkel44 0:61364762ee0e 42 if(hex) printf(" ");
jmarkel44 0:61364762ee0e 43 for(int i=7; i>=0; i--)
jmarkel44 0:61364762ee0e 44 {
jmarkel44 0:61364762ee0e 45 if(i<7 && (i%4)==3) printf(" "); if(input & (1<<i)) printf("1"); else printf("0");
jmarkel44 0:61364762ee0e 46 }
jmarkel44 0:61364762ee0e 47 }
jmarkel44 0:61364762ee0e 48 if(dec)
jmarkel44 0:61364762ee0e 49 {
jmarkel44 0:61364762ee0e 50 if(hex || bin) printf(" "); printf("%u", input);
jmarkel44 0:61364762ee0e 51 }
jmarkel44 0:61364762ee0e 52 if(post[0] != 0) printf("%s", post);
jmarkel44 0:61364762ee0e 53 }
jmarkel44 0:61364762ee0e 54
jmarkel44 0:61364762ee0e 55
jmarkel44 0:61364762ee0e 56 void print_us(char hex, char bin, char dec, char* pre, unsigned short int input, char* post)
jmarkel44 0:61364762ee0e 57 {
jmarkel44 0:61364762ee0e 58 if(pre[0] != 0) printf("%s", pre);
jmarkel44 0:61364762ee0e 59
jmarkel44 0:61364762ee0e 60 if(hex)
jmarkel44 0:61364762ee0e 61 {
jmarkel44 0:61364762ee0e 62 printf("0x%04X", input);
jmarkel44 0:61364762ee0e 63 }
jmarkel44 0:61364762ee0e 64 if(bin)
jmarkel44 0:61364762ee0e 65 {
jmarkel44 0:61364762ee0e 66 if(hex) printf(" ");
jmarkel44 0:61364762ee0e 67 for(int i=15; i>=0; i--)
jmarkel44 0:61364762ee0e 68 {
jmarkel44 0:61364762ee0e 69 if(i<15 && (i%4)==3) printf(" "); if(input & (1<<i)) printf("1"); else printf("0");
jmarkel44 0:61364762ee0e 70 }
jmarkel44 0:61364762ee0e 71 }
jmarkel44 0:61364762ee0e 72 if(dec)
jmarkel44 0:61364762ee0e 73 {
jmarkel44 0:61364762ee0e 74 if(hex || bin) printf(" "); printf("%u", input);
jmarkel44 0:61364762ee0e 75 }
jmarkel44 0:61364762ee0e 76 if(post[0] != 0) printf("%s", post);
jmarkel44 0:61364762ee0e 77 }
jmarkel44 0:61364762ee0e 78
jmarkel44 0:61364762ee0e 79 // -------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 80 // initialization
jmarkel44 0:61364762ee0e 81
jmarkel44 0:61364762ee0e 82 RawSerial mod(PC_6, PC_7);
jmarkel44 0:61364762ee0e 83
jmarkel44 0:61364762ee0e 84 DigitalOut mod_de(PC_8);
jmarkel44 0:61364762ee0e 85 DigitalOut mod_re(PC_9);
jmarkel44 0:61364762ee0e 86
jmarkel44 0:61364762ee0e 87 void mod_init(void)
jmarkel44 0:61364762ee0e 88 {
jmarkel44 0:61364762ee0e 89 mod_de = 0;
jmarkel44 0:61364762ee0e 90 mod_re = 0;
jmarkel44 0:61364762ee0e 91
jmarkel44 0:61364762ee0e 92 mod.baud(MOD_BAUD);
jmarkel44 0:61364762ee0e 93 mod.attach(&mod_process, RawSerial::RxIrq);
jmarkel44 0:61364762ee0e 94
jmarkel44 0:61364762ee0e 95 for(int i=0; i<MOD_IREG; i++) mod_ireg[i] = 0;
jmarkel44 0:61364762ee0e 96 }
jmarkel44 0:61364762ee0e 97
jmarkel44 0:61364762ee0e 98 // -------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 99 // utilities
jmarkel44 0:61364762ee0e 100
jmarkel44 0:61364762ee0e 101 void mod_clear(void)
jmarkel44 0:61364762ee0e 102 {
jmarkel44 0:61364762ee0e 103 mod_rxnum = 0; for(int i=0; i<MOD_RXNUM; i++) mod_rxbuf[i] = 0;
jmarkel44 0:61364762ee0e 104 mod_txnum = 0; for(int i=0; i<MOD_TXNUM; i++) mod_txbuf[i] = 0;
jmarkel44 0:61364762ee0e 105 }
jmarkel44 0:61364762ee0e 106
jmarkel44 0:61364762ee0e 107 unsigned short int mod_calc_crc(unsigned char *buffer, int length)
jmarkel44 0:61364762ee0e 108 {
jmarkel44 0:61364762ee0e 109 unsigned short int temp=0xFFFF, flag;
jmarkel44 0:61364762ee0e 110
jmarkel44 0:61364762ee0e 111 for(int i=0; i<length; i++)
jmarkel44 0:61364762ee0e 112 {
jmarkel44 0:61364762ee0e 113 temp = temp ^ buffer[i];
jmarkel44 0:61364762ee0e 114
jmarkel44 0:61364762ee0e 115 for(int j=1; j<=8; j++)
jmarkel44 0:61364762ee0e 116 {
jmarkel44 0:61364762ee0e 117 flag = temp & 0x0001;
jmarkel44 0:61364762ee0e 118 temp = temp >> 1;
jmarkel44 0:61364762ee0e 119 if(flag) temp = temp ^ 0xA001;
jmarkel44 0:61364762ee0e 120 }
jmarkel44 0:61364762ee0e 121 }
jmarkel44 0:61364762ee0e 122
jmarkel44 0:61364762ee0e 123 return(temp);
jmarkel44 0:61364762ee0e 124 }
jmarkel44 0:61364762ee0e 125
jmarkel44 0:61364762ee0e 126 void mod_ireg_dump(void)
jmarkel44 0:61364762ee0e 127 {
jmarkel44 0:61364762ee0e 128 for(int i=0; i<MOD_IREG; i++)
jmarkel44 0:61364762ee0e 129 {
jmarkel44 0:61364762ee0e 130 printf(" I%02d = ", i);
jmarkel44 0:61364762ee0e 131 print_us(1,0,1, "", mod_ireg[i], "\r\n");
jmarkel44 0:61364762ee0e 132 }
jmarkel44 0:61364762ee0e 133 }
jmarkel44 0:61364762ee0e 134
jmarkel44 0:61364762ee0e 135 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 136 // process received data
jmarkel44 0:61364762ee0e 137
jmarkel44 0:61364762ee0e 138 void mod_process(void)
jmarkel44 0:61364762ee0e 139 {
jmarkel44 0:61364762ee0e 140 if(mod.readable())
jmarkel44 0:61364762ee0e 141 {
jmarkel44 0:61364762ee0e 142 if(mod_rxnum < MOD_RXNUM)
jmarkel44 0:61364762ee0e 143 {
jmarkel44 0:61364762ee0e 144 mod_rxbuf[mod_rxnum++] = mod.getc();
jmarkel44 0:61364762ee0e 145 }
jmarkel44 0:61364762ee0e 146 else
jmarkel44 0:61364762ee0e 147 {
jmarkel44 0:61364762ee0e 148 if(mod_verbose) printf(" [mod_process] buffer full\r\n");
jmarkel44 0:61364762ee0e 149 mod_clear();
jmarkel44 0:61364762ee0e 150 }
jmarkel44 0:61364762ee0e 151 }
jmarkel44 0:61364762ee0e 152 }
jmarkel44 0:61364762ee0e 153
jmarkel44 0:61364762ee0e 154 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 155 // MOD_FUNC_GET_IREG (NBYT = total bytes of data transmitted)
jmarkel44 0:61364762ee0e 156 // MOD_FUNC_GET_HREG
jmarkel44 0:61364762ee0e 157 //
jmarkel44 0:61364762ee0e 158 // byte: 0 1 2 3 4 5 6 7
jmarkel44 0:61364762ee0e 159 // received: ADDR FUNC SREG-H SREG-L NREG-H NREG-L RCRC-L RCRC-H
jmarkel44 0:61364762ee0e 160 // transmit: ADDR FUNC NBYT DATA-H DATA-L TCRC-L TCRC-H NULL
jmarkel44 0:61364762ee0e 161
jmarkel44 0:61364762ee0e 162 int mod_read(int inp_addr, int inp_func, int inp_sreg, int inp_nreg, unsigned char *rd_buf)
jmarkel44 0:61364762ee0e 163 {
jmarkel44 0:61364762ee0e 164 int mod_error = 0;
jmarkel44 0:61364762ee0e 165
jmarkel44 0:61364762ee0e 166 unsigned char tx_addr = inp_addr;
jmarkel44 0:61364762ee0e 167 unsigned char tx_func = inp_func;
jmarkel44 0:61364762ee0e 168 WORD2BYTE tx_sreg; tx_sreg.value = inp_sreg;
jmarkel44 0:61364762ee0e 169 if(inp_nreg < 1) inp_nreg = 1;
jmarkel44 0:61364762ee0e 170 WORD2BYTE tx_nreg; tx_nreg.value = inp_nreg;
jmarkel44 0:61364762ee0e 171
jmarkel44 0:61364762ee0e 172 // fill transmit buffer
jmarkel44 0:61364762ee0e 173
jmarkel44 0:61364762ee0e 174 mod_clear();
jmarkel44 0:61364762ee0e 175
jmarkel44 0:61364762ee0e 176 mod_txbuf[mod_txnum++] = tx_addr;
jmarkel44 0:61364762ee0e 177 mod_txbuf[mod_txnum++] = tx_func;
jmarkel44 0:61364762ee0e 178 mod_txbuf[mod_txnum++] = tx_sreg.byte1;
jmarkel44 0:61364762ee0e 179 mod_txbuf[mod_txnum++] = tx_sreg.byte0;
jmarkel44 0:61364762ee0e 180 mod_txbuf[mod_txnum++] = tx_nreg.byte1;
jmarkel44 0:61364762ee0e 181 mod_txbuf[mod_txnum++] = tx_nreg.byte0;
jmarkel44 0:61364762ee0e 182
jmarkel44 0:61364762ee0e 183 WORD2BYTE tx_crc; tx_crc.value = mod_calc_crc(mod_txbuf, mod_txnum);
jmarkel44 0:61364762ee0e 184 mod_txbuf[mod_txnum++] = tx_crc.byte0;
jmarkel44 0:61364762ee0e 185 mod_txbuf[mod_txnum++] = tx_crc.byte1;
jmarkel44 0:61364762ee0e 186
jmarkel44 0:61364762ee0e 187 // transmit
jmarkel44 0:61364762ee0e 188
jmarkel44 0:61364762ee0e 189 mod_de = 1;
jmarkel44 0:61364762ee0e 190 mod_re = 1;
jmarkel44 0:61364762ee0e 191 wait_ms(1);
jmarkel44 0:61364762ee0e 192 for(int i=0; i<mod_txnum; i++) mod.putc(mod_txbuf[i]);
jmarkel44 0:61364762ee0e 193 wait_ms(2);
jmarkel44 0:61364762ee0e 194 mod_de = 0;
jmarkel44 0:61364762ee0e 195 mod_re = 0;
jmarkel44 0:61364762ee0e 196
jmarkel44 0:61364762ee0e 197 wait_ms(30);
jmarkel44 0:61364762ee0e 198
jmarkel44 0:61364762ee0e 199 // output transmit buffer
jmarkel44 0:61364762ee0e 200
jmarkel44 0:61364762ee0e 201 if(mod_verbose)
jmarkel44 0:61364762ee0e 202 {
jmarkel44 0:61364762ee0e 203 printf(" mod_txbuf: %d\r\n\r\n", mod_txnum);
jmarkel44 0:61364762ee0e 204 for(int i=0; i<mod_txnum; i++)
jmarkel44 0:61364762ee0e 205 {
jmarkel44 0:61364762ee0e 206 printf(" %02d", i); print_uc(1,0,1, " = ", mod_txbuf[i], "\r\n");
jmarkel44 0:61364762ee0e 207 }
jmarkel44 0:61364762ee0e 208 if(mod_txnum)
jmarkel44 0:61364762ee0e 209 {
jmarkel44 0:61364762ee0e 210 printf("\r\n");
jmarkel44 0:61364762ee0e 211 print_uc(1,0,1, " addr = ", tx_addr, "\r\n");
jmarkel44 0:61364762ee0e 212 print_uc(1,0,1, " func = ", tx_func, "\r\n");
jmarkel44 0:61364762ee0e 213 print_us(1,0,1, " sreg = ", tx_sreg.value, "\r\n");
jmarkel44 0:61364762ee0e 214 print_us(1,0,1, " nreg = ", tx_nreg.value, "\r\n");
jmarkel44 0:61364762ee0e 215 print_us(1,0,1, " tcrc = ", tx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 216 }
jmarkel44 0:61364762ee0e 217 }
jmarkel44 0:61364762ee0e 218
jmarkel44 0:61364762ee0e 219 // process received buffer
jmarkel44 0:61364762ee0e 220
jmarkel44 0:61364762ee0e 221 if(mod_verbose)
jmarkel44 0:61364762ee0e 222 {
jmarkel44 0:61364762ee0e 223 printf("\r\n mod_rxbuf: %d\r\n\r\n", mod_rxnum);
jmarkel44 0:61364762ee0e 224 for(int i=0; i<mod_rxnum; i++)
jmarkel44 0:61364762ee0e 225 {
jmarkel44 0:61364762ee0e 226 printf(" %02d", i); print_uc(1,0,1, " = ", mod_rxbuf[i], "\r\n");
jmarkel44 0:61364762ee0e 227 }
jmarkel44 0:61364762ee0e 228 }
jmarkel44 0:61364762ee0e 229 if(mod_rxnum)
jmarkel44 0:61364762ee0e 230 {
jmarkel44 0:61364762ee0e 231 int rxnum = 0;
jmarkel44 0:61364762ee0e 232 unsigned char rx_addr = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 233 unsigned char rx_func = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 234
jmarkel44 0:61364762ee0e 235 if(mod_verbose)
jmarkel44 0:61364762ee0e 236 {
jmarkel44 0:61364762ee0e 237 print_uc(1,0,1, "\r\n addr = ", rx_addr, "\r\n");
jmarkel44 0:61364762ee0e 238 print_uc(1,0,1, " func = ", rx_func, "");
jmarkel44 0:61364762ee0e 239 }
jmarkel44 0:61364762ee0e 240 if(rx_func == tx_func)
jmarkel44 0:61364762ee0e 241 {
jmarkel44 0:61364762ee0e 242 int rd_buf_index = 0;
jmarkel44 0:61364762ee0e 243 unsigned char rx_nbyt = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 244
jmarkel44 0:61364762ee0e 245 if(mod_verbose) print_uc(1,0,1, "\r\n nbyt = ", rx_nbyt, "\r\n\r\n");
jmarkel44 0:61364762ee0e 246
jmarkel44 0:61364762ee0e 247 for(int i=0; i<rx_nbyt/2; i++)
jmarkel44 0:61364762ee0e 248 {
jmarkel44 0:61364762ee0e 249 WORD2BYTE rx_data;
jmarkel44 0:61364762ee0e 250 rd_buf[rd_buf_index++] = rx_data.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 251 rd_buf[rd_buf_index++] = rx_data.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 252
jmarkel44 0:61364762ee0e 253 int ireg = tx_sreg.value + i;
jmarkel44 0:61364762ee0e 254
jmarkel44 0:61364762ee0e 255 if(ireg < MOD_IREG) mod_ireg[ireg] = rx_data.value;
jmarkel44 0:61364762ee0e 256
jmarkel44 0:61364762ee0e 257 if(mod_verbose)
jmarkel44 0:61364762ee0e 258 {
jmarkel44 0:61364762ee0e 259 printf(" data(%03d)", ireg);
jmarkel44 0:61364762ee0e 260 print_us(1,0,1, " = ", rx_data.value, "\r\n");
jmarkel44 0:61364762ee0e 261 }
jmarkel44 0:61364762ee0e 262 }
jmarkel44 0:61364762ee0e 263 WORD2BYTE rx_crc;
jmarkel44 0:61364762ee0e 264 rx_crc.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 265 rx_crc.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 266
jmarkel44 0:61364762ee0e 267 if(mod_verbose) print_us(1,0,1, "\r\n rcrc = ", rx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 268 }
jmarkel44 0:61364762ee0e 269 else
jmarkel44 0:61364762ee0e 270 {
jmarkel44 0:61364762ee0e 271 unsigned char rx_nerr = mod_rxbuf[rxnum++]; mod_error = rx_nerr;
jmarkel44 0:61364762ee0e 272
jmarkel44 0:61364762ee0e 273 if(mod_verbose)
jmarkel44 0:61364762ee0e 274 {
jmarkel44 0:61364762ee0e 275 if(rx_func == tx_func+0x80) printf(" (func %d error)\r\n", tx_func);
jmarkel44 0:61364762ee0e 276 else printf(" (unknown func error)\r\n");
jmarkel44 0:61364762ee0e 277 print_uc(1,0,1, " nerr = ", rx_nerr, " (");
jmarkel44 0:61364762ee0e 278
jmarkel44 0:61364762ee0e 279 switch(rx_nerr)
jmarkel44 0:61364762ee0e 280 {
jmarkel44 0:61364762ee0e 281 case MOD_ERROR_ILL_FUNC: ; printf("slave received illegal function code") ; break;
jmarkel44 0:61364762ee0e 282 case MOD_ERROR_ILL_ADDR: ; printf("slave received illegal register address") ; break;
jmarkel44 0:61364762ee0e 283 case MOD_ERROR_ILL_DATA: ; printf("slave received illegal register value") ; break;
jmarkel44 0:61364762ee0e 284 case MOD_ERROR_SLAVE_FAIL: ; printf("slave device-specific failure") ; break;
jmarkel44 0:61364762ee0e 285 case MOD_ERROR_SLAVE_ACK: ; printf("slave ACK") ; break;
jmarkel44 0:61364762ee0e 286 case MOD_ERROR_SLAVE_BUSY: ; printf("slave is busy") ; break;
jmarkel44 0:61364762ee0e 287 case MOD_ERROR_SLAVE_NACK: ; printf("slave NACK") ; break;
jmarkel44 0:61364762ee0e 288 case MOD_ERROR_SLAVE_PARITY: ; printf("slave memory parity error") ; break;
jmarkel44 0:61364762ee0e 289 case MOD_ERROR_RX_TIMEOUT: ; printf("master receive timeout") ; break;
jmarkel44 0:61364762ee0e 290 case MOD_ERROR_TX_TIMEOUT: ; printf("master transmit timeout") ; break;
jmarkel44 0:61364762ee0e 291 case MOD_ERROR_CRC: ; printf("master CRC error") ; break;
jmarkel44 0:61364762ee0e 292 default: ; printf("unknown error") ; break;
jmarkel44 0:61364762ee0e 293 }
jmarkel44 0:61364762ee0e 294 printf(")\r\n");
jmarkel44 0:61364762ee0e 295 }
jmarkel44 0:61364762ee0e 296
jmarkel44 0:61364762ee0e 297 WORD2BYTE rx_crc;
jmarkel44 0:61364762ee0e 298 rx_crc.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 299 rx_crc.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 300
jmarkel44 0:61364762ee0e 301 if(mod_verbose) print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 302 }
jmarkel44 0:61364762ee0e 303 }
jmarkel44 0:61364762ee0e 304 else
jmarkel44 0:61364762ee0e 305 {
jmarkel44 0:61364762ee0e 306 mod_error = MOD_ERROR_RX_TIMEOUT; // no received data
jmarkel44 0:61364762ee0e 307 }
jmarkel44 0:61364762ee0e 308
jmarkel44 0:61364762ee0e 309 if(mod_verbose) printf("\r\n mod_error: %d\r\n", mod_error);
jmarkel44 0:61364762ee0e 310
jmarkel44 0:61364762ee0e 311 return(mod_error);
jmarkel44 0:61364762ee0e 312 }
jmarkel44 0:61364762ee0e 313
jmarkel44 0:61364762ee0e 314 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 315 // MOD_FUNC_SET_HREG
jmarkel44 0:61364762ee0e 316 //
jmarkel44 0:61364762ee0e 317 // byte: 0 1 2 3 4 5 6 7 8
jmarkel44 0:61364762ee0e 318 // received: ADDR FUNC SREG-H SREG-L DATA-H DATA-L RCRC-L RCRC-H
jmarkel44 0:61364762ee0e 319 // transmit: ADDR FUNC SREG-H SREG-L DATA-H DATA-L TCRC-L TCRC-H NULL
jmarkel44 0:61364762ee0e 320 //
jmarkel44 0:61364762ee0e 321 // MOD_FUNC_SET_HREGS
jmarkel44 0:61364762ee0e 322 //
jmarkel44 0:61364762ee0e 323 // byte: 0 1 2 3 4 5 6 7 8 9 10
jmarkel44 0:61364762ee0e 324 // received: ADDR FUNC SREG-H SREG-L NREG-H NREG-L NBYT DATA-H DATA-L RCRC-L RCRC-H
jmarkel44 0:61364762ee0e 325 // transmit: ADDR FUNC SREG-H SREG-L NREG-H NREG-L TCRC-L TCRC-H NULL
jmarkel44 0:61364762ee0e 326 //
jmarkel44 0:61364762ee0e 327 int mod_write(int inp_addr, int inp_func, int inp_sreg, int inp_nreg, unsigned char *xmt_data)
jmarkel44 0:61364762ee0e 328 {
jmarkel44 0:61364762ee0e 329 int mod_error = 0;
jmarkel44 0:61364762ee0e 330
jmarkel44 0:61364762ee0e 331 unsigned char tx_addr = inp_addr;
jmarkel44 0:61364762ee0e 332 unsigned char tx_func = inp_func;
jmarkel44 0:61364762ee0e 333 WORD2BYTE tx_sreg; tx_sreg.value = inp_sreg;
jmarkel44 0:61364762ee0e 334 WORD2BYTE tx_nreg; tx_nreg.value = inp_nreg;
jmarkel44 0:61364762ee0e 335 WORD2BYTE data;
jmarkel44 0:61364762ee0e 336 unsigned char nbyt = 2*inp_nreg;
jmarkel44 0:61364762ee0e 337
jmarkel44 0:61364762ee0e 338 // fill transmit buffer
jmarkel44 0:61364762ee0e 339
jmarkel44 0:61364762ee0e 340 mod_clear();
jmarkel44 0:61364762ee0e 341
jmarkel44 0:61364762ee0e 342 mod_txbuf[mod_txnum++] = tx_addr;
jmarkel44 0:61364762ee0e 343 mod_txbuf[mod_txnum++] = tx_func;
jmarkel44 0:61364762ee0e 344 mod_txbuf[mod_txnum++] = tx_sreg.byte1;
jmarkel44 0:61364762ee0e 345 mod_txbuf[mod_txnum++] = tx_sreg.byte0;
jmarkel44 0:61364762ee0e 346
jmarkel44 0:61364762ee0e 347 if(tx_func == MOD_FUNC_SET_HREG)
jmarkel44 0:61364762ee0e 348 {
jmarkel44 0:61364762ee0e 349 // data.value = xmt_data[0];
jmarkel44 0:61364762ee0e 350 // mod_txbuf[mod_txnum++] = data.byte1;
jmarkel44 0:61364762ee0e 351 // mod_txbuf[mod_txnum++] = data.byte0;
jmarkel44 0:61364762ee0e 352 mod_txbuf[mod_txnum++] = xmt_data[0];
jmarkel44 0:61364762ee0e 353 mod_txbuf[mod_txnum++] = xmt_data[1];
jmarkel44 0:61364762ee0e 354 }
jmarkel44 0:61364762ee0e 355 else
jmarkel44 0:61364762ee0e 356 {
jmarkel44 0:61364762ee0e 357 mod_txbuf[mod_txnum++] = tx_nreg.byte1;
jmarkel44 0:61364762ee0e 358 mod_txbuf[mod_txnum++] = tx_nreg.byte0;
jmarkel44 0:61364762ee0e 359 mod_txbuf[mod_txnum++] = nbyt;
jmarkel44 0:61364762ee0e 360 for(int i=0,i2=0; i<inp_nreg; i++)
jmarkel44 0:61364762ee0e 361 {
jmarkel44 0:61364762ee0e 362 // data.value = xmt_data[i];
jmarkel44 0:61364762ee0e 363 // mod_txbuf[mod_txnum++] = data.byte1;
jmarkel44 0:61364762ee0e 364 // mod_txbuf[mod_txnum++] = data.byte0;
jmarkel44 0:61364762ee0e 365 mod_txbuf[mod_txnum++] = xmt_data[i2];
jmarkel44 0:61364762ee0e 366 mod_txbuf[mod_txnum++] = xmt_data[(i2+1)];
jmarkel44 0:61364762ee0e 367 i2=i2+2;
jmarkel44 0:61364762ee0e 368 }
jmarkel44 0:61364762ee0e 369 }
jmarkel44 0:61364762ee0e 370
jmarkel44 0:61364762ee0e 371 WORD2BYTE tx_crc; tx_crc.value = mod_calc_crc(mod_txbuf, mod_txnum);
jmarkel44 0:61364762ee0e 372 mod_txbuf[mod_txnum++] = tx_crc.byte0;
jmarkel44 0:61364762ee0e 373 mod_txbuf[mod_txnum++] = tx_crc.byte1;
jmarkel44 0:61364762ee0e 374
jmarkel44 0:61364762ee0e 375 // transmit
jmarkel44 0:61364762ee0e 376
jmarkel44 0:61364762ee0e 377 mod_de = 1;
jmarkel44 0:61364762ee0e 378 mod_re = 1;
jmarkel44 0:61364762ee0e 379 wait_ms(1);
jmarkel44 0:61364762ee0e 380 for(int i=0; i<mod_txnum; i++) mod.putc(mod_txbuf[i]);
jmarkel44 0:61364762ee0e 381 wait_ms(2);
jmarkel44 0:61364762ee0e 382 mod_de = 0;
jmarkel44 0:61364762ee0e 383 mod_re = 0;
jmarkel44 0:61364762ee0e 384
jmarkel44 0:61364762ee0e 385 wait_ms(30);
jmarkel44 0:61364762ee0e 386
jmarkel44 0:61364762ee0e 387 // output transmit buffer
jmarkel44 0:61364762ee0e 388
jmarkel44 0:61364762ee0e 389 if(mod_verbose)
jmarkel44 0:61364762ee0e 390 {
jmarkel44 0:61364762ee0e 391 printf(" mod_txbuf: %d\r\n\r\n", mod_txnum);
jmarkel44 0:61364762ee0e 392 for(int i=0; i<mod_txnum; i++)
jmarkel44 0:61364762ee0e 393 {
jmarkel44 0:61364762ee0e 394 printf(" %02d", i); print_uc(1,0,1, " = ", mod_txbuf[i], "\r\n");
jmarkel44 0:61364762ee0e 395 }
jmarkel44 0:61364762ee0e 396
jmarkel44 0:61364762ee0e 397 if(mod_txnum)
jmarkel44 0:61364762ee0e 398 {
jmarkel44 0:61364762ee0e 399 print_uc(1,0,1, "\r\n addr = ", tx_addr, "\r\n");
jmarkel44 0:61364762ee0e 400 print_uc(1,0,1, " func = ", tx_func, "\r\n");
jmarkel44 0:61364762ee0e 401 print_us(1,0,1, " sreg = ", tx_sreg.value, "\r\n");
jmarkel44 0:61364762ee0e 402
jmarkel44 0:61364762ee0e 403 if(tx_func == MOD_FUNC_SET_HREG)
jmarkel44 0:61364762ee0e 404 {
jmarkel44 0:61364762ee0e 405 data.value = xmt_data[0];
jmarkel44 0:61364762ee0e 406 print_us(1,0,1, " data = ", data.value, "\r\n");
jmarkel44 0:61364762ee0e 407 }
jmarkel44 0:61364762ee0e 408 else
jmarkel44 0:61364762ee0e 409 {
jmarkel44 0:61364762ee0e 410 print_us(1,0,1, " nreg = ", tx_nreg.value, "\r\n");
jmarkel44 0:61364762ee0e 411 print_uc(1,0,1, " nbyt = ", nbyt, "\r\n\r\n");
jmarkel44 0:61364762ee0e 412
jmarkel44 0:61364762ee0e 413 for(int i=0; i<inp_nreg; i++)
jmarkel44 0:61364762ee0e 414 {
jmarkel44 0:61364762ee0e 415 printf(" data(%03d)", tx_sreg.value+i);
jmarkel44 0:61364762ee0e 416 data.value = xmt_data[i];
jmarkel44 0:61364762ee0e 417 print_us(1,0,1, " = ", data.value, "\r\n");
jmarkel44 0:61364762ee0e 418 }
jmarkel44 0:61364762ee0e 419 }
jmarkel44 0:61364762ee0e 420 print_us(1,0,1, " tcrc = ", tx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 421 }
jmarkel44 0:61364762ee0e 422 }
jmarkel44 0:61364762ee0e 423
jmarkel44 0:61364762ee0e 424 // process received buffer
jmarkel44 0:61364762ee0e 425
jmarkel44 0:61364762ee0e 426 if(mod_verbose)
jmarkel44 0:61364762ee0e 427 {
jmarkel44 0:61364762ee0e 428 printf("\r\n mod_rxbuf: %d\r\n\r\n", mod_rxnum);
jmarkel44 0:61364762ee0e 429 for(int i=0; i<mod_rxnum; i++)
jmarkel44 0:61364762ee0e 430 {
jmarkel44 0:61364762ee0e 431 printf(" %02d", i); print_uc(1,0,1, " = ", mod_rxbuf[i], "\r\n");
jmarkel44 0:61364762ee0e 432 }
jmarkel44 0:61364762ee0e 433 }
jmarkel44 0:61364762ee0e 434 if(mod_rxnum)
jmarkel44 0:61364762ee0e 435 {
jmarkel44 0:61364762ee0e 436 int rxnum = 0;
jmarkel44 0:61364762ee0e 437 unsigned char rx_addr = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 438 unsigned char rx_func = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 439
jmarkel44 0:61364762ee0e 440 if(mod_verbose)
jmarkel44 0:61364762ee0e 441 {
jmarkel44 0:61364762ee0e 442 print_uc(1,0,1, "\r\n addr = ", rx_addr, "\r\n");
jmarkel44 0:61364762ee0e 443 print_uc(1,0,1, " func = ", rx_func, "");
jmarkel44 0:61364762ee0e 444 }
jmarkel44 0:61364762ee0e 445
jmarkel44 0:61364762ee0e 446 if(rx_func == tx_func)
jmarkel44 0:61364762ee0e 447 {
jmarkel44 0:61364762ee0e 448 WORD2BYTE rx_sreg;
jmarkel44 0:61364762ee0e 449 rx_sreg.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 450 rx_sreg.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 451
jmarkel44 0:61364762ee0e 452 WORD2BYTE rx_nreg;
jmarkel44 0:61364762ee0e 453 rx_nreg.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 454 rx_nreg.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 455
jmarkel44 0:61364762ee0e 456 WORD2BYTE rx_crc;
jmarkel44 0:61364762ee0e 457 rx_crc.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 458 rx_crc.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 459
jmarkel44 0:61364762ee0e 460 if(mod_verbose)
jmarkel44 0:61364762ee0e 461 {
jmarkel44 0:61364762ee0e 462 print_us(1,0,1, "\r\n sreg = ", rx_sreg.value, "\r\n");
jmarkel44 0:61364762ee0e 463 print_us(1,0,1, " nreg = ", rx_nreg.value, "\r\n");
jmarkel44 0:61364762ee0e 464 print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 465 }
jmarkel44 0:61364762ee0e 466 }
jmarkel44 0:61364762ee0e 467 else
jmarkel44 0:61364762ee0e 468 {
jmarkel44 0:61364762ee0e 469 unsigned char rx_nerr = mod_rxbuf[rxnum++]; mod_error = rx_nerr;
jmarkel44 0:61364762ee0e 470
jmarkel44 0:61364762ee0e 471 if(mod_verbose)
jmarkel44 0:61364762ee0e 472 {
jmarkel44 0:61364762ee0e 473 if(rx_func == tx_func+0x80) printf(" (func %d error)\r\n", tx_func);
jmarkel44 0:61364762ee0e 474 else printf(" (unknown func error)\r\n");
jmarkel44 0:61364762ee0e 475
jmarkel44 0:61364762ee0e 476 print_uc(1,0,1, " nerr = ", rx_nerr, " (");
jmarkel44 0:61364762ee0e 477
jmarkel44 0:61364762ee0e 478 switch(rx_nerr)
jmarkel44 0:61364762ee0e 479 {
jmarkel44 0:61364762ee0e 480 case MOD_ERROR_ILL_FUNC: ; printf("slave received illegal function code") ; break;
jmarkel44 0:61364762ee0e 481 case MOD_ERROR_ILL_ADDR: ; printf("slave received illegal register address") ; break;
jmarkel44 0:61364762ee0e 482 case MOD_ERROR_ILL_DATA: ; printf("slave received illegal register value") ; break;
jmarkel44 0:61364762ee0e 483 case MOD_ERROR_SLAVE_FAIL: ; printf("slave device-specific failure") ; break;
jmarkel44 0:61364762ee0e 484 case MOD_ERROR_SLAVE_ACK: ; printf("slave ACK") ; break;
jmarkel44 0:61364762ee0e 485 case MOD_ERROR_SLAVE_BUSY: ; printf("slave is busy") ; break;
jmarkel44 0:61364762ee0e 486 case MOD_ERROR_SLAVE_NACK: ; printf("slave NACK") ; break;
jmarkel44 0:61364762ee0e 487 case MOD_ERROR_SLAVE_PARITY: ; printf("slave memory parity error") ; break;
jmarkel44 0:61364762ee0e 488 case MOD_ERROR_RX_TIMEOUT: ; printf("master receive timeout") ; break;
jmarkel44 0:61364762ee0e 489 case MOD_ERROR_TX_TIMEOUT: ; printf("master transmit timeout") ; break;
jmarkel44 0:61364762ee0e 490 case MOD_ERROR_CRC: ; printf("master CRC error") ; break;
jmarkel44 0:61364762ee0e 491 default: ; printf("unknown error") ; break;
jmarkel44 0:61364762ee0e 492 }
jmarkel44 0:61364762ee0e 493 printf(")\r\n");
jmarkel44 0:61364762ee0e 494 }
jmarkel44 0:61364762ee0e 495
jmarkel44 0:61364762ee0e 496 WORD2BYTE rx_crc;
jmarkel44 0:61364762ee0e 497 rx_crc.byte0 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 498 rx_crc.byte1 = mod_rxbuf[rxnum++];
jmarkel44 0:61364762ee0e 499
jmarkel44 0:61364762ee0e 500 if(mod_verbose) print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
jmarkel44 0:61364762ee0e 501 }
jmarkel44 0:61364762ee0e 502 }
jmarkel44 0:61364762ee0e 503 else
jmarkel44 0:61364762ee0e 504 {
jmarkel44 0:61364762ee0e 505 mod_error = MOD_ERROR_RX_TIMEOUT; // no received data
jmarkel44 0:61364762ee0e 506 }
jmarkel44 0:61364762ee0e 507
jmarkel44 0:61364762ee0e 508 if(mod_verbose) printf("\r\n mod_error: %d\r\n", mod_error);
jmarkel44 0:61364762ee0e 509
jmarkel44 0:61364762ee0e 510 return(mod_error);
jmarkel44 0:61364762ee0e 511 }
jmarkel44 0:61364762ee0e 512
jmarkel44 0:61364762ee0e 513 // ---------------------------------------------------------------------------------------------------------------------
jmarkel44 0:61364762ee0e 514
jmarkel44 0:61364762ee0e 515
jmarkel44 0:61364762ee0e 516