From 77fb52f9b641f441cbf933e524ac43c935ec5dec Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 23:37:33 +0100 Subject: [PATCH 1/5] set fuse-bits for slavechip --- firmware/slavechip/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/slavechip/Makefile b/firmware/slavechip/Makefile index 1846ba1..aef3d40 100644 --- a/firmware/slavechip/Makefile +++ b/firmware/slavechip/Makefile @@ -24,7 +24,7 @@ flash: all avrdude -c usbasp -p m88 -U flash:w:firmware.hex fuses: - avrdude -c usbasp -p m88 -U lfuse:w:0xdf:m -U hfuse:w:0xde:m # external oscillator + avrdude -c usbasp -p m88 -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xf9:m ## what are the source dependencies From d0020aac149a971e2cde6ceb1568eda7c0707ead Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Fri, 10 Dec 2010 23:39:00 +0100 Subject: [PATCH 2/5] fixed doc a bit, trying to add usb->spi interface --- documentation/SPI-Proto | 4 ++-- firmware/masterchip/usb.c | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/documentation/SPI-Proto b/documentation/SPI-Proto index cd16977..5f36039 100644 --- a/documentation/SPI-Proto +++ b/documentation/SPI-Proto @@ -6,7 +6,7 @@ Where following values are Valid: |--------------------------------------------------------------------------------------------------------------------------| -| Binary Hex Name Address ValueL ValueH Reply Description| +| Decimal Hex Name Address ValueL ValueH Reply Description| |--------------------------------------------------------------------------------------------------------------------------| | 0000001 0x01 Read-Temp Number of zeroes/Rand zeroes/Rand A 16Bit Value Reads the | | Thermometer Representing Temperature| @@ -24,7 +24,7 @@ Where following values are Valid: | 0000005 0x05 Write-Var16 Number of the Value of Var Value of Var zeroes/Rand Writes 16 | | var-DEFINE to write (HIGH) to write (LOW) Bit Var | |--------------------------------------------------------------------------------------------------------------------------| -| 0000006 0x07 Call-Func Number of the zeroes/Rand zeroes/Rand zeroes/Rand Calls a | +| 0000006 0x06 Call-Func Number of the zeroes/Rand zeroes/Rand zeroes/Rand Calls a | | func-DEFINE remote | function | |--------------------------------------------------------------------------------------------------------------------------| diff --git a/firmware/masterchip/usb.c b/firmware/masterchip/usb.c index cbbd7b7..e1b646d 100644 --- a/firmware/masterchip/usb.c +++ b/firmware/masterchip/usb.c @@ -4,22 +4,34 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data; static uchar dataBuffer[4]; - if(rq->bRequest == 1){ + if(rq->bRequest == 1) { dataBuffer[0] = (thermoData [0] & 0xff00)>>8; dataBuffer[1] = thermoData [0] & 0x00ff; dataBuffer[2] = (thermoData [1] & 0xff00)>>8; dataBuffer[3] = thermoData [1] & 0x00ff; usbMsgPtr = dataBuffer; return 4; - } - - if(rq->bRequest == 2){ + } else if(rq->bRequest == 2) { dataBuffer[0] = (thermoData [2] & 0xff00)>>8; dataBuffer[1] = thermoData [2] & 0x00ff; dataBuffer[2] = (thermoData [3] & 0xff00)>>8; dataBuffer[3] = thermoData [3] & 0x00ff; usbMsgPtr = dataBuffer; return 4; + } else { + uint8_t opcode = (rq->bRequest & 0xff00)>>8; + uint8_t addr = (rq->wValue & 0xff00)>>8; + uint8_t valH = rq->wIndex & 0x00ff; + uint8_t valL = (rq->wIndex & 0xff00)>>8; + + // uint16_t reply = do_spi_stuff(opcode, addr, valH, valL); + dataBuffer[0] = (reply & 0xff00)>>8; + dataBuffer[1] = reply & 0x00ff; + dataBuffer[2] = 0x0000; + dataBuffer[3] = 0x0000; + usbMsgPtr = dataBuffer; + return 4; + } return 0; From 1bf5c0c29eb112ac3fca71d8640afb8f7693dd1d Mon Sep 17 00:00:00 2001 From: Paul Goeser Date: Fri, 10 Dec 2010 23:43:52 +0100 Subject: [PATCH 3/5] cleanup in spi --- firmware/shared/spi.c | 11 +++-------- firmware/shared/spi.h | 2 ++ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/firmware/shared/spi.c b/firmware/shared/spi.c index 2d653d1..28c2db7 100644 --- a/firmware/shared/spi.c +++ b/firmware/shared/spi.c @@ -73,6 +73,9 @@ void spi_init(){ SPCR = spcr; } + + + void spi_mst_start_packet(){ SPI_SSOUT &= ~(_BV(SPI_SS_PIN)); } @@ -138,11 +141,3 @@ void spi_sla_handle_packet(){ - -#ifndef SPI_MASTER -ISR(SPI_vector){ - -} - - -#endif //SPI_MASTER diff --git a/firmware/shared/spi.h b/firmware/shared/spi.h index 9ad1eba..49a065b 100644 --- a/firmware/shared/spi.h +++ b/firmware/shared/spi.h @@ -9,6 +9,8 @@ #define SPI_SS_PORT D #define SPI_SS_PIN 7 + + // copied/adapted from usbdrv.h #define SPI_CONCAT(a, b) a ## b From 5614ec78df9401f97c976a09d93fb628c2063131 Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Fri, 10 Dec 2010 23:44:05 +0100 Subject: [PATCH 4/5] could work a bit better now? --- cmdline/read-temp.c | 34 +++++++++++++++++----------------- firmware/masterchip/usb.c | 10 +++++++--- firmware/shared/spi.h | 7 ++++++- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/cmdline/read-temp.c b/cmdline/read-temp.c index 449a6d8..19bb79f 100644 --- a/cmdline/read-temp.c +++ b/cmdline/read-temp.c @@ -67,24 +67,24 @@ int cnt, vid, pid; int rxValue, rxIndex; int value = 0, index = 0; - int i=0; - cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 1, value, index, buffer, sizeof(buffer), 5000); - 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); - fprintf(stderr, "%3d.%02d*C ", rxValue/100, rxValue%100); - fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); + /* int i=0; */ + /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 1, value, index, buffer, sizeof(buffer), 5000); */ + /* 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); */ + /* fprintf(stderr, "%3d.%02d*C ", rxValue/100, rxValue%100); */ + /* fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); */ - cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 2, value, index, buffer, sizeof(buffer), 5000); - 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); - fprintf(stderr, "%3d.%02d*C ", rxValue/100, rxValue%100); - fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); + /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 2, value, index, buffer, sizeof(buffer), 5000); */ + /* 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); */ + /* fprintf(stderr, "%3d.%02d*C ", rxValue/100, rxValue%100); */ + /* fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); */ usb_close(handle); diff --git a/firmware/masterchip/usb.c b/firmware/masterchip/usb.c index e1b646d..8afae2e 100644 --- a/firmware/masterchip/usb.c +++ b/firmware/masterchip/usb.c @@ -24,9 +24,13 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { uint8_t valH = rq->wIndex & 0x00ff; uint8_t valL = (rq->wIndex & 0xff00)>>8; - // uint16_t reply = do_spi_stuff(opcode, addr, valH, valL); - dataBuffer[0] = (reply & 0xff00)>>8; - dataBuffer[1] = reply & 0x00ff; + uint8_t send[] = {opcode, addr, valH, valL}; + uint8_t recv[2]; + spi_mst_write(4, data); + spi_mst_read(2, data) + + dataBuffer[0] = recv[0]; + dataBuffer[1] = recv[1]; dataBuffer[2] = 0x0000; dataBuffer[3] = 0x0000; usbMsgPtr = dataBuffer; diff --git a/firmware/shared/spi.h b/firmware/shared/spi.h index 9ad1eba..fc54966 100644 --- a/firmware/shared/spi.h +++ b/firmware/shared/spi.h @@ -20,7 +20,12 @@ #define SPI_SSIN SPI_INPORT(SPI_SS_PORT) #define SPI_SSDDR SPI_DDRPORT(SPI_SS_PORT) -uint8_t spi_write(uint8_t *data, uint8_t len); void spi_init(); +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_sla_handle_packet(); + #endif From 0eccb96b3972e27c021bbf43ecfab3b5bd8290a1 Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Sat, 11 Dec 2010 00:06:54 +0100 Subject: [PATCH 5/5] added todo --- TODO | 2 +- cmdline/read-temp.c | 6 ++++-- firmware/masterchip/spi_proto.c | 1 + firmware/masterchip/spi_proto.h | 1 + firmware/masterchip/usb.c | 19 +++++++++++-------- firmware/shared/spi.c | 3 +++ 6 files changed, 21 insertions(+), 11 deletions(-) create mode 120000 firmware/masterchip/spi_proto.c create mode 120000 firmware/masterchip/spi_proto.h diff --git a/TODO b/TODO index e9284c0..c680bab 100644 --- a/TODO +++ b/TODO @@ -9,7 +9,7 @@ Software: - irgendein Protokoll für SPI - A/D-Wandler-Ansteuercode - Check spi_proto include stuff? - +- slave nicht aufhängen lassen wenn zu wenig gelesen Später: - PT1000 diff --git a/cmdline/read-temp.c b/cmdline/read-temp.c index 19bb79f..93bc4ad 100644 --- a/cmdline/read-temp.c +++ b/cmdline/read-temp.c @@ -68,7 +68,7 @@ int cnt, vid, pid; int value = 0, index = 0; /* int i=0; */ - /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 1, value, index, buffer, sizeof(buffer), 5000); */ + /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 100, value, index, buffer, sizeof(buffer), 5000); */ /* if(cnt < 0){ */ /* fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror()); */ /* } */ @@ -77,7 +77,7 @@ int cnt, vid, pid; /* fprintf(stderr, "%3d.%02d*C ", rxValue/100, rxValue%100); */ /* fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); */ - /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 2, value, index, buffer, sizeof(buffer), 5000); */ + /* cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 101, value, index, buffer, sizeof(buffer), 5000); */ /* if(cnt < 0){ */ /* fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror()); */ /* } */ @@ -87,6 +87,8 @@ int cnt, vid, pid; /* fprintf(stderr, "%3d.%02d*C \n", rxIndex/100, rxIndex%100); */ + + usb_close(handle); return 0; } diff --git a/firmware/masterchip/spi_proto.c b/firmware/masterchip/spi_proto.c new file mode 120000 index 0000000..a86d415 --- /dev/null +++ b/firmware/masterchip/spi_proto.c @@ -0,0 +1 @@ +../shared/spi_proto.c \ No newline at end of file diff --git a/firmware/masterchip/spi_proto.h b/firmware/masterchip/spi_proto.h new file mode 120000 index 0000000..8d40308 --- /dev/null +++ b/firmware/masterchip/spi_proto.h @@ -0,0 +1 @@ +../shared/spi_proto.h \ No newline at end of file diff --git a/firmware/masterchip/usb.c b/firmware/masterchip/usb.c index 8afae2e..5c9ed9e 100644 --- a/firmware/masterchip/usb.c +++ b/firmware/masterchip/usb.c @@ -1,17 +1,20 @@ #include "main.h" +#include "spi.h" +#include "spi_proto.h" +#include "usb.h" usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data; static uchar dataBuffer[4]; - if(rq->bRequest == 1) { + if(rq->bRequest == 100) { dataBuffer[0] = (thermoData [0] & 0xff00)>>8; dataBuffer[1] = thermoData [0] & 0x00ff; dataBuffer[2] = (thermoData [1] & 0xff00)>>8; dataBuffer[3] = thermoData [1] & 0x00ff; usbMsgPtr = dataBuffer; return 4; - } else if(rq->bRequest == 2) { + } else if(rq->bRequest == 101) { dataBuffer[0] = (thermoData [2] & 0xff00)>>8; dataBuffer[1] = thermoData [2] & 0x00ff; dataBuffer[2] = (thermoData [3] & 0xff00)>>8; @@ -19,15 +22,15 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbMsgPtr = dataBuffer; return 4; } else { - uint8_t opcode = (rq->bRequest & 0xff00)>>8; - uint8_t addr = (rq->wValue & 0xff00)>>8; - uint8_t valH = rq->wIndex & 0x00ff; - uint8_t valL = (rq->wIndex & 0xff00)>>8; + uint8_t opcode = (uint8_t) ((rq->bRequest & 0xff00)>>8); + 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]; uint8_t send[] = {opcode, addr, valH, valL}; uint8_t recv[2]; - spi_mst_write(4, data); - spi_mst_read(2, data) + spi_mst_write(4, send); + if(!spi_proto_needswrite(opcode)) spi_mst_read(2, recv); dataBuffer[0] = recv[0]; dataBuffer[1] = recv[1]; diff --git a/firmware/shared/spi.c b/firmware/shared/spi.c index 28c2db7..ca39c0b 100644 --- a/firmware/shared/spi.c +++ b/firmware/shared/spi.c @@ -103,7 +103,10 @@ void spi_mst_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; SPI_WAIT;