diff --git a/cmdline/read-temp.c b/cmdline/read-temp.c index c6aa9e7..9567b7c 100644 --- a/cmdline/read-temp.c +++ b/cmdline/read-temp.c @@ -106,12 +106,13 @@ int cnt, vid, pid; if(cnt < 0){ fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror()); } - rxValue = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8); - rxIndex = ((int)buffer[3] & 0xff) | (((int)buffer[2] & 0xff) << 8); + rxIndex = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8); fprintf(stderr, "request = 0x%04x\n", opcode); - fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, addr); - fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, value); +// fprintf(stderr, "answer: opcode=0x%02x addr=0x%02x value=0x%04x (%i)\n", buffer[1],buffer[0],rxIndex,rxIndex); + fprintf(stderr, "answer: value=0x%04x (%i)\n", rxIndex,rxIndex); +// fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, addr); +// fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, value); } else { usage(); } diff --git a/firmware/masterchip/usb.c b/firmware/masterchip/usb.c index a6cd43c..12f6682 100644 --- a/firmware/masterchip/usb.c +++ b/firmware/masterchip/usb.c @@ -10,6 +10,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data; static uchar dataBuffer[5]; + uint16_t recv; if(rq->bRequest == 100) { dataBuffer[0] = (thermoData [0] & 0xff00)>>8; @@ -26,23 +27,18 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbMsgPtr = dataBuffer; return 4; } else { - uint8_t opcode = (uint8_t) ((rq->bRequest & 0xff00)>>8); + uint8_t opcode = (uint8_t) rq->bRequest; uint8_t addr = (uint8_t) rq->wValue.bytes[0]; uint8_t valH = (uint8_t) rq->wIndex.bytes[0]; uint8_t valL = (uint8_t) rq->wIndex.bytes[1]; uint16_t send = (valH << 8) | valL; -// uint16_t recv = spi_master_communicate(opcode, addr, send); + uint16_t recv = spi_master_transceive(opcode, addr, send); - dataBuffer[0] = opcode; - dataBuffer[1] = addr; - dataBuffer[2] = valH; - dataBuffer[3] = valL; - spi_mst_start_packet(); - spi_mst_write_read(5,dataBuffer); - spi_mst_end_packet(); - usbMsgPtr = dataBuffer+1; - return 4; + dataBuffer[0] = (recv & 0xff00) >> 8; + dataBuffer[1] = (recv & 0xff); + usbMsgPtr = dataBuffer; + return 2; } diff --git a/firmware/shared/spi.c b/firmware/shared/spi.c index 49547f6..45a4204 100644 --- a/firmware/shared/spi.c +++ b/firmware/shared/spi.c @@ -126,24 +126,15 @@ void spi_mst_write_read(uint8_t len, uint8_t *data){ void spi_sla_handle_packet(){ // TODO: make slave not hangup in case of partial read uint8_t opcode, addr, do_write; - uint16_t data; - opcode = readbuf[0]; - addr = readbuf[1]; - do_write = spi_proto_needswrite(opcode); - if(do_write){ - data = spi_proto_handlewrite(opcode, addr); - writebuf[0]=opcode; - writebuf[1]=addr; - writebuf[2]=(data>>8)&0xff; - writebuf[3]=(data)&0xff; - } else { - writebuf[0]=0; - writebuf[1]=2; - writebuf[2]=4; - writebuf[3]=6; - data = (readbuf[3]<<8)&0xff | readbuf[4]; - spi_proto_handleread(opcode, addr, data); - } + uint16_t data, newdata; + opcode = readbuf[1]; + addr = readbuf[2]; + data = (readbuf[3]<<8)&0xff | readbuf[4]; + newdata = spi_proto_slaveaction(opcode, addr, data); + writebuf[0]=opcode; + writebuf[1]=addr; + writebuf[2]=(newdata>>8)&0xff; + writebuf[3]=(newdata)&0xff; } diff --git a/firmware/shared/spi.h b/firmware/shared/spi.h index 51e7290..ad91bb2 100644 --- a/firmware/shared/spi.h +++ b/firmware/shared/spi.h @@ -22,6 +22,7 @@ void spi_mst_start_packet(); void spi_mst_end_packet(); void spi_mst_write(uint8_t len, uint8_t *data); void spi_mst_read(uint8_t len, uint8_t *data); +void spi_mst_write_read(uint8_t len, uint8_t *data); void spi_sla_handle_packet(); diff --git a/firmware/shared/spi_proto.c b/firmware/shared/spi_proto.c index 16e8ad5..3496540 100644 --- a/firmware/shared/spi_proto.c +++ b/firmware/shared/spi_proto.c @@ -3,88 +3,51 @@ /***** MASTER *****/ -uint8_t read_data[2]; -uint8_t write_data[4]; +uint8_t mst_buf[5]; -void talk_to_slave(uint8_t opcode, uint8_t addr, uint8_t flags) +uint16_t spi_master_transceive(uint8_t opcode, uint8_t addr, uint16_t value) { - write_data[0] = opcode; - write_data[1] = addr; - spi_mst_start_packet(); - spi_mst_write(flags & SPI_WRITE_DATA? 4 : 3, write_data); - spi_mst_read(flags & SPI_READ_DATA? 2 : 0, read_data); - spi_mst_end_packet(); -} - -uint16_t spi_master_communicate(uint8_t opcode, uint8_t addr, uint16_t value) -{ - uint8_t flags = spi_proto_needs(opcode); - write_data[0] = opcode; - write_data[1] = addr; - write_data[2] = value >> 8; - write_data[3] = value & 0xff; - spi_mst_start_packet(); - spi_mst_write_read(4,write_data); - spi_mst_end_packet(); - while(write_data[0] == 0){ - spi_mst_start_packet(); - spi_mst_write_read(4,write_data); - spi_mst_end_packet(); - } - return (write_data[2] << 8) | read_data[3]; -} - -uint8_t spi_proto_needs(uint8_t opcode) -{ - uint8_t r = SPI_NONE; - switch(opcode) - { - case 1: case 2: case 3: - r = SPI_READ_DATA; - break; - case 4: case 5: - r = SPI_WRITE_DATA; - break; - } - return r; + do{ + mst_buf[0] = opcode; + mst_buf[1] = addr; + mst_buf[2] = value >> 8; + mst_buf[3] = value & 0xff; + mst_buf[4] = 0; // additional 0 to read the last byte from the slave + spi_mst_start_packet(); + spi_mst_write_read(5,mst_buf); + spi_mst_end_packet(); + } while(mst_buf[1] == 0); // wait for echoed opcode + + // bytes from slave are received shifted right by one + return (mst_buf[3] << 8) | mst_buf[4]; } uint16_t read_temperature(uint8_t number) { - talk_to_slave(1, number, SPI_READ_DATA); - return (read_data[0] << 8) | read_data[1]; + return 0; } uint8_t read_var8(uint8_t number) { - talk_to_slave(2, number, SPI_READ_DATA); - return read_data[1]; + return 0; } uint16_t read_var16(uint8_t number) { - talk_to_slave(3, number, SPI_READ_DATA); - return (read_data[0] << 8) | read_data[1]; + return 0; } void write_var8(uint8_t number, uint8_t value) { - write_data[2] = 0; - write_data[3] = number; - talk_to_slave(4, number, SPI_WRITE_DATA); } void write_var16(uint8_t number, uint16_t value) { - write_data[2] = value >> 8; - write_data[3] = value & 0xff; - talk_to_slave(5, number, SPI_WRITE_DATA); } void call_func(uint8_t number) { - talk_to_slave(6, number, SPI_NONE); } @@ -92,33 +55,33 @@ void call_func(uint8_t number) /***** SLAVE *****/ -uint8_t spi_proto_needswrite(uint8_t opcode) { - if(opcode == 4 || opcode == 5) return 0; - return 1; -} - -uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr) { - if(opcode == 4) { - return (uint16_t) (*spi_proto_globals8[addr]); - } else if(opcode == 5) { - return (*spi_proto_globals16[addr]); - } else { - return 0xFeFe; - } - -} - -void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data) { - if(opcode == 2) { - *spi_proto_globals8[addr] = (uint8_t) data; - } else if(opcode == 3) { - *spi_proto_globals16[addr] = data; - } else if (opcode == 6) { - funptr_t func = spi_proto_funcs[addr]; - (*func)(); - } else { - // boom - } +uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data) { + uint16_t retval = 0; + switch(opcode){ + case 0: + retval = data; + break; + case 1: + //TODO + retval = 0; + break; + case 2: + retval = (*spi_proto_globals8[addr]); + break; + case 3: + retval = (*spi_proto_globals16[addr]); + break; + case 4: + (*spi_proto_globals8[addr]) = data; + break; + case 5: + (*spi_proto_globals16[addr]) = data; + break; + case 6: + (*spi_proto_funcs[addr])(); + break; + } + return retval; } /***** SLAVE END *****/ diff --git a/firmware/shared/spi_proto.h b/firmware/shared/spi_proto.h index 1d08792..e410236 100644 --- a/firmware/shared/spi_proto.h +++ b/firmware/shared/spi_proto.h @@ -9,9 +9,8 @@ #define SPI_READ_DATA 0x10 #define SPI_NONE 0 -uint16_t spi_master_communicate(uint8_t opcode, uint8_t address, uint16_t value); +uint16_t spi_master_transceive(uint8_t opcode, uint8_t address, uint16_t value); -uint8_t spi_proto_needs(uint8_t opcode); uint16_t read_temperature(uint8_t number); uint8_t read_var8(uint8_t number); @@ -30,9 +29,7 @@ extern funptr_t spi_proto_funcs[]; */ #include "spi_pointers.h" -uint8_t spi_proto_needswrite(uint8_t opcode); -uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr); -void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data); +uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data); /***** SLAVE END *****/