summaryrefslogtreecommitdiff
path: root/firmware/spi.c
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2011-10-13 20:33:30 +0200
committerYves Fischer <yvesf-git@xapek.org>2011-10-13 20:33:30 +0200
commit5d9d373a959271b498710817d08c2ea8e153aa6e (patch)
tree6867e887454a850b4e15616000ef342a1c661c7e /firmware/spi.c
parent35a36b0a6c69ce136fd6ea2a203d34e48e1291e8 (diff)
downloadmini-octopus-5d9d373a959271b498710817d08c2ea8e153aa6e.tar.gz
mini-octopus-5d9d373a959271b498710817d08c2ea8e153aa6e.zip
correct firmware??
Diffstat (limited to 'firmware/spi.c')
-rw-r--r--firmware/spi.c190
1 files changed, 62 insertions, 128 deletions
diff --git a/firmware/spi.c b/firmware/spi.c
index b3e3a95..2b8abb1 100644
--- a/firmware/spi.c
+++ b/firmware/spi.c
@@ -36,24 +36,26 @@
#include "spi.h"
-
void spi_parser(char *buf)
{
switch(buf[0]) {
case CMD_SPI_INIT:
- spi_init_usb(buf[2], buf[3], buf[4]);
- break;
+ spi_init_usb();
+ break;
case CMD_SPI_DEINIT:
spi_deinit_usb();
- break;
+ break;
+ case CMD_SPI_SPEED:
+ spi_set_speed_usb((int)buf[2]);
+ break;
case CMD_SPI_SEND:
- spi_send_usb(buf[2], &buf[3]);
- break;
+ spi_send_usb(&buf[2], (int)buf[1]);
+ break;
case CMD_SPI_RECV:
- spi_receive_usb((int)buf[2]);
+ spi_receive_usb((int)buf[1]);
case CMD_SPI_SEND_AND_RECV:
- spi_send_and_receive_usb(&buf[3], (int)buf[2]);
- break;
+ spi_send_and_receive_usb(&buf[2], (int)buf[1]);
+ break;
default:
answer[0] = buf[0];
answer[1] = RSP_UNKOWN_CMD;
@@ -62,111 +64,38 @@ void spi_parser(char *buf)
}
}
-void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed)
+void spi_init_usb(void)
{
answer[0] = CMD_SPI_INIT;
- answer[1] = (unsigned char) spi_init(dord, mode, speed);
- answer[2] = 0;
+ answer[1] = (unsigned char) spi_init();
+ answer[3] = 0;
CommandAnswer(3);
}
-int spi_init(uint8_t dord, uint8_t mode, uint8_t speed)
+int spi_init(void)
{
- uint8_t cpol, cpha, spr1, spr0, spi2x;
-
- dord = dord ? 1 : 0;
-
- switch(mode)
- {
- case 0:
- cpol = 0;
- cpha = 0;
- break;
- case 1:
- cpol = 0;
- cpha = 1;
- break;
- case 2:
- cpol = 1;
- cpha = 0;
- break;
- case 3:
- cpol = 1;
- cpha = 1;
- break;
- default:
- return RSP_ERROR;
- }
-
- switch(speed)
- {
- case SPI_SPEED_125kHz:
- spi2x = 0;
- spr1 = 1;
- spr0 = 1;
- break;
- case SPI_SPEED_250kHz:
- spi2x = 0;
- spr1 = 1;
- spr0 = 0;
- break;
- case SPI_SPEED_500kHz:
- spi2x = 1;
- spr1 = 1;
- spr0 = 0;
- break;
- case SPI_SPEED_1MHz:
- spi2x = 0;
- spr1 = 0;
- spr0 = 1;
- break;
- case SPI_SPEED_2MHz:
- spi2x = 1;
- spr1 = 0;
- spr0 = 1;
- break;
- case SPI_SPEED_4MHz:
- spi2x = 0;
- spr1 = 0;
- spr0 = 0;
- break;
- case SPI_SPEED_8MHz:
- spi2x = 1;
- spr1 = 0;
- spr0 = 0;
- break;
- default:
- return RSP_ERROR;
- }
+ PORTB &= ~((1 << SCK)|(1<<MISO)|(1<<MOSI)); // SCK have to be low in IDLE
+ DDRB &=~(1 << MISO);
+ DDRB = (1 << MOSI)|(1 << SCK);
- // MOSI, SCK: out/low
- // MISO: in
- DDRB &= ~(1 << MISO);
- DDRB |= (1 << MOSI | 1 << SCK);
- PORTB &= ~(1 << MOSI | 1 << MISO | 1 << SCK); // SCK has to be low in IDLE
+ SPCR = 0;
+ SPSR = 0;
- // SPE: SPI enable
- // DORD: Data Order (0: starting with LSB)
- // MSTR: Master mode
- // SPR1, SPR2, SPI2X: speed
- SPCR = (1 << SPE | dord << DORD | 1 << MSTR | cpol << CPOL | cpha << CPHA |
- spr1 << SPR1 | spr0 << SPR0);
- SPSR = (spi2x << SPI2X);
+ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);
- octopus.ports[5] = PIN_SCK;
- octopus.ports[6] = PIN_MOSI;
- octopus.ports[7] = PIN_MISO;
+ octopus.ports[5]=PIN_SCK;
+ octopus.ports[6]=PIN_MOSI;
+ octopus.ports[7]=PIN_MISO;
return RSP_OK;
}
void spi_deinit_usb(void)
{
- answer[0] = CMD_SPI_DEINIT;
- answer[1] = (unsigned char)spi_deinit();
- answer[2] = 0;
-
+ answer[0]=CMD_SPI_DEINIT;
+ answer[1]=(unsigned char)spi_deinit();
+ answer[2]=0;
CommandAnswer(3);
}
@@ -175,30 +104,36 @@ int spi_deinit(void)
SPCR = 0;
SPSR = 0;
- octopus.ports[5] = PIN_NONE;
- octopus.ports[6] = PIN_NONE;
- octopus.ports[7] = PIN_NONE;
+ octopus.ports[5]=PIN_OUT; // this is wrong!
+ octopus.ports[6]=PIN_OUT; // this is wrong!
+ octopus.ports[7]=PIN_OUT; // this is wrong!
return RSP_OK;
}
+void spi_set_speed_usb(int speed){
-void spi_send_usb(uint8_t length, char * buf)
-{
- answer[0] = CMD_SPI_SEND;
- answer[1] = (unsigned char)spi_send(length, buf);
- answer[2] = 0;
+}
+
+int spi_set_speed(int speed){
+
+ return RSP_OK;
+}
+void spi_send_usb(char * buf, int length)
+{
+ answer[0]=CMD_SPI_SEND;
+ answer[1]=(unsigned char)spi_send(buf,length);
+ answer[2]=0;
CommandAnswer(3);
}
-int spi_send(int length, char * buf)
+int spi_send(char * buf, int length)
{
- uint8_t i;
- for(i = 0; i < length; i++)
- {
+ int i;
+ for(i=0;i<length;i++){
SPDR = buf[i];
- while(!(SPSR & (1 << SPIF)));
+ while ( !(SPSR & (1 << SPIF)) ) ;
}
return RSP_OK;
}
@@ -206,29 +141,22 @@ int spi_send(int length, char * buf)
void spi_receive_usb(int length)
{
- answer[0] = CMD_SPI_RECV;
- answer[1] = (unsigned char)spi_receive(length, (char*)&answer[2]);
- answer[2+length] = 0;
- CommandAnswer(3+length);
+ answer[0]=CMD_SPI_RECV;
+ answer[1]=(unsigned char)spi_receive((char*)&answer[2],length);
+ answer[2]=0;
+ CommandAnswer(length+2);
}
-unsigned char spi_receive(int length, char * buf)
+unsigned char spi_receive( char * buf, int length)
{
int i;
int timeout = 0;
-
- for(i = 0; i < length; i++)
- {
+ for(i=0;i<length;i++){
SPDR = 0;
- while(!(SPSR & (1 << SPIF)))
- {
- if(timeout++ > 1000)
- return RSP_TIMEOUT;
- }
- buf[i] = SPDR;
+ while(!(SPSR & (1 << SPIF))) { timeout++; if( timeout > 1000) return RSP_TIMEOUT; }
+ buf[i]=SPDR;
}
-
return RSP_OK;
}
@@ -236,8 +164,8 @@ void spi_send_and_receive_usb(char * txbuf, int length)
{
answer[0]=CMD_SPI_SEND;
answer[1]=(unsigned char)spi_send_and_receive(txbuf,(char *)&answer[2],length);
- answer[2+length]=0;
- CommandAnswer(3+length);
+ answer[2]=0;
+ CommandAnswer(2+length);
}
@@ -252,3 +180,9 @@ int spi_send_and_receive(char * txbuf, char * rxbuf, int length){
}
return RSP_OK;
}
+
+
+
+
+
+