Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

Committer:
davidjhoward
Date:
Thu Oct 06 15:24:10 2016 +0000
Revision:
190:af7ab603c9fe
Child:
197:594afd088f32
add new modbus driver and error flags for readings

Who changed what in which revision?

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