/* read_file_record_rsp Input: int8 address Slave Address int8 byte_count Number of bytes to send read_sub_request_rsp* request Structure holding record/data information Output: void */ void modbus_read_file_record_rsp(int8 address, int8 byte_count, modbus_read_sub_request_rsp *request) { int8 i=0,j; modbus_serial_send_start(address, FUNC_READ_FILE_RECORD); modbus_serial_putc(byte_count); while(i < byte_count); { modbus_serial_putc(request->record_length); modbus_serial_putc(request->reference_type); for(j=0; (j < request->record_length); j+=2) { modbus_serial_putc(make8(request->data[j], 1)); modbus_serial_putc(make8(request->data[j], 0)); } i += (request->record_length)+1; request++; } modbus_serial_send_stop(); }
// preamble -> FORMATTED -> unit id -> dest id -> data -> csum -> close... // copied from transmitter code void rf_xmit_packet(int8 data) { int8 i; int8 outbytes[8]; int16 crc; outbytes[0] = START_ID; outbytes[1] = TX_ID; outbytes[2] = UNIT_ID; outbytes[3] = RX_ID; outbytes[4] = dest_id; outbytes[5] = data; crc = _CRC16_(outbytes, 6); outbytes[6] = make8(crc,0); outbytes[7] = make8(crc,1); WriteCMD(0x8228); // OPEN PA delay_us(4); WriteCMD(0x8238); delay_us(1); WriteFSKbyte(0xAA); // PREAMBLE WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteFSKbyte(0x2D); // SYNCHRO PATTERN 0x2DD4 WriteFSKbyte(0xD4); for (i=0; i<8; i++) WriteFSKbyte(outbytes[i]); WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteCMD(0x8208); // CLOSE PA }
/* diagnostics_rsp Input: int8 address Slave Address int16 sub_func Echo of sub function received int16 data Echo of data received Output: void */ void modbus_diagnostics_rsp(int8 address, int16 sub_func, int16 data) { modbus_serial_send_start(address, FUNC_DIAGNOSTICS); modbus_serial_putc(make8(sub_func,1)); modbus_serial_putc(make8(sub_func,0)); modbus_serial_putc(make8(data,1)); modbus_serial_putc(make8(data,0)); modbus_serial_send_stop(); }
/* write_multiple_registers_rsp Input: int8 address Slave Address int16 start_address Echo of address to start at int16 quantity Echo of amount of registers written to Output: void */ void modbus_write_multiple_registers_rsp(int8 address, int16 start_address, int16 quantity) { modbus_serial_send_start(address, FUNC_WRITE_MULTIPLE_REGISTERS); modbus_serial_putc(make8(start_address,1)); modbus_serial_putc(make8(start_address,0)); modbus_serial_putc(make8(quantity,1)); modbus_serial_putc(make8(quantity,0)); modbus_serial_send_stop(); }
/* get_comm_event_counter_rsp Input: int8 address Slave Address int16 status Status, refer to MODBUS documentation int16 event_count Count of events Output: void */ void modbus_get_comm_event_counter_rsp(int8 address, int16 status, int16 event_count) { modbus_serial_send_start(address, FUNC_GET_COMM_EVENT_COUNTER); modbus_serial_putc(make8(status, 1)); modbus_serial_putc(make8(status, 0)); modbus_serial_putc(make8(event_count, 1)); modbus_serial_putc(make8(event_count, 0)); modbus_serial_send_stop(); }
/* write_single_register_rsp Input: int8 address Slave Address int16 reg_address Echo of register address received int16 reg_value Echo of register value received Output: void */ void modbus_write_single_register_rsp(int8 address, int16 reg_address, int16 reg_value) { modbus_serial_send_start(address, FUNC_WRITE_SINGLE_REGISTER); modbus_serial_putc(make8(reg_address,1)); modbus_serial_putc(make8(reg_address,0)); modbus_serial_putc(make8(reg_value,1)); modbus_serial_putc(make8(reg_value,0)); modbus_serial_send_stop(); }
/* write_single_coil_rsp Input: int8 address Slave Address int16 output_address Echo of output address received int16 output_value Echo of output value received Output: void */ void modbus_write_single_coil_rsp(int8 address, int16 output_address, int16 output_value) { modbus_serial_send_start(address, FUNC_WRITE_SINGLE_COIL); modbus_serial_putc(make8(output_address,1)); modbus_serial_putc(make8(output_address,0)); modbus_serial_putc(make8(output_value,1)); modbus_serial_putc(make8(output_value,0)); modbus_serial_send_stop(); }
/* write_file_record_rsp Input: int8 address Slave Address int8 byte_count Echo of number of bytes sent write_sub_request_rsp* request Echo of Structure holding record information Output: void */ void modbus_write_file_record_rsp(int8 address, int8 byte_count, modbus_write_sub_request_rsp *request) { int8 i, j=0; modbus_serial_send_start(address, FUNC_WRITE_FILE_RECORD); modbus_serial_putc(byte_count); for(i=0; i < byte_count; i+=(7+(j*2))) { modbus_serial_putc(request->reference_type); modbus_serial_putc(make8(request->file_number, 1)); modbus_serial_putc(make8(request->file_number, 0)); modbus_serial_putc(make8(request->record_number, 1)); modbus_serial_putc(make8(request->record_number, 0)); modbus_serial_putc(make8(request->record_length, 1)); modbus_serial_putc(make8(request->record_length, 0)); for(j=0; (j < request->record_length); j+=2) { modbus_serial_putc(make8(request->data[j], 1)); modbus_serial_putc(make8(request->data[j], 0)); } } modbus_serial_send_stop(); }
/* read_write_multiple_registers_rsp Input: int8 address Slave Address int16* data Pointer to an array of data int8 data_len Length of data in bytes Output: void */ void modbus_read_write_multiple_registers_rsp(int8 address, int8 data_len, int16 *data) { int8 i; modbus_serial_send_start(address, FUNC_READ_WRITE_MULTIPLE_REGISTERS); modbus_serial_putc(data_len*2); for(i=0; i < data_len*2; i+=2) { modbus_serial_putc(make8(data[i], 1)); modbus_serial_putc(make8(data[i], 0)); } modbus_serial_send_stop(); }
unsigned int16 calculate_crc16(unsigned int16 old_crc, unsigned int8 data) { unsigned int16 crc16bit; unsigned int16 x; x = make8(old_crc,1) ^ data; //x = ((old_crc>>8) ^ data) & 0xff; x ^= x>>4; crc16bit = (old_crc << 8) ^ (x << 12) ^ (x <<5) ^ x; return crc16bit; }
/* get_comm_event_counter_rsp Input: int8 address Slave Address int16 status Status, refer to MODBUS documentation int16 event_count Count of events int16 message_count Count of messages int8* events Pointer to event data int8 events_len Length of event data in bytes Output: void */ void modbus_get_comm_event_log_rsp(int8 address, int16 status, int16 event_count, int16 message_count, int8 *events, int8 events_len) { int8 i; modbus_serial_send_start(address, FUNC_GET_COMM_EVENT_LOG); modbus_serial_putc(events_len+6); modbus_serial_putc(make8(status, 1)); modbus_serial_putc(make8(status, 0)); modbus_serial_putc(make8(event_count, 1)); modbus_serial_putc(make8(event_count, 0)); modbus_serial_putc(make8(message_count, 1)); modbus_serial_putc(make8(message_count, 0)); for(i=0; i < events_len; ++i) { modbus_serial_putc(*events); events++; } modbus_serial_send_stop(); }
int mmcsd_send_cmd(int cmd, long long arg, short g_CRC_enabled) { int packet[6]; packet[0] = cmd | 0x40; packet[1] = make8(arg, 3); packet[2] = make8(arg, 2); packet[3] = make8(arg, 1); packet[4] = make8(arg, 0); if (g_CRC_enabled) packet[5] = mmcsd_crc7(packet, 5); else packet[5] = DUMMY_BYTE; spi_write(packet[0]); spi_write(packet[1]); spi_write(packet[2]); spi_write(packet[3]); spi_write(packet[4]); spi_write(packet[5]); return 0; }
/* mask_write_register_rsp Input: int8 address Slave Address int16 reference_address Echo of reference address int16 AND_mask Echo of AND mask int16 OR_mask Echo or OR mask Output: void */ void modbus_mask_write_register_rsp(int8 address, int16 reference_address, int16 AND_mask, int16 OR_mask) { modbus_serial_send_start(address, FUNC_MASK_WRITE_REGISTER); modbus_serial_putc(make8(reference_address,1)); modbus_serial_putc(make8(reference_address,0)); modbus_serial_putc(make8(AND_mask,1)); modbus_serial_putc(make8(AND_mask,0)); modbus_serial_putc(make8(OR_mask, 1)); modbus_serial_putc(make8(OR_mask, 0)); modbus_serial_send_stop(); }
/* read_FIFO_queue_rsp Input: int8 address Slave Address int16 FIFO_len Length of FIFO in bytes int16* data Pointer to an array of data Output: void */ void modbus_read_FIFO_queue_rsp(int8 address, int16 FIFO_len, int16 *data) { int8 i; int16 byte_count; byte_count = ((FIFO_len*2)+2); modbus_serial_send_start(address, FUNC_READ_FIFO_QUEUE); modbus_serial_putc(make8(byte_count, 1)); modbus_serial_putc(make8(byte_count, 0)); modbus_serial_putc(make8(FIFO_len, 1)); modbus_serial_putc(make8(FIFO_len, 0)); for(i=0; i < FIFO_len; i+=2) { modbus_serial_putc(make8(data[i], 1)); modbus_serial_putc(make8(data[i], 0)); } modbus_serial_send_stop(); }
void rtc_write_int32(int8 addr, int32 val) { write_rtc(addr+0,make8(val,3)); // MSB at address+0 write_rtc(addr+1,make8(val,2)); write_rtc(addr+2,make8(val,1)); write_rtc(addr+3,make8(val,0)); // LSB at address+3 }
void rtc_write_float(int8 addr, union_int32_float u) { write_rtc(addr+0,make8(u.l,3)); // MSB at address+0 write_rtc(addr+1,make8(u.l,2)); write_rtc(addr+2,make8(u.l,1)); write_rtc(addr+3,make8(u.l,0)); // LSB at address+3 }
void rtc_write_int16(int8 addr, int16 val) { write_rtc(addr+0,make8(val,1)); write_rtc(addr+1,make8(val,0)); }