Merge branch 'master' of gitorious.ghostdub.de:avr/thermocouple

master
Dario Ernst 15 years ago
commit 3e9c71263b

@ -84,10 +84,10 @@ int __attribute__((noreturn)) main(void) {
} }
SOFTTIMER(1,250) { SOFTTIMER(1,250) {
//updateTemperature(); updateTemperature();
} }
SOFTTIMER(3,100) { /* SOFTTIMER(3,100) {
/* uint8_t foo[4]; /* uint8_t foo[4];
foo[0]=0x55; foo[0]=0x55;
foo[1]=0x88; foo[1]=0x88;
@ -96,20 +96,20 @@ int __attribute__((noreturn)) main(void) {
spi_mst_start_packet(); spi_mst_start_packet();
spi_mst_write_read(2,foo+2); spi_mst_write_read(2,foo+2);
spi_mst_end_packet(); spi_mst_end_packet();
*/
uint16_t foo=0x3456; uint16_t foo=0x3456;
foo=spi_master_communicate(3,5,foo); foo=spi_master_communicate(3,5,foo);
display_gotoyx(0,0); display_gotoyx(0,0);
/* display_puthex(foo[0]); display_puthex(foo[0]);
display_puthex(foo[1]); display_puthex(foo[1]);
display_puthex(foo[2]); display_puthex(foo[2]);
display_puthex(foo[3]);*/ display_puthex(foo[3]);
display_puthex((foo>>8)&0xff); display_puthex((foo>>8)&0xff);
display_puthex((foo)&0xff); display_puthex((foo)&0xff);
display_puts("\nfoo"); display_puts("\nfoo");
display_update(); display_update();
} }*/
} }
} }

@ -14,6 +14,9 @@
* currently alpha, uses interrupts, single master/single slave operation * currently alpha, uses interrupts, single master/single slave operation
*/ */
uint8_t readbuf[4];
uint8_t writebuf[4];
uint8_t pos;
@ -70,6 +73,7 @@ void spi_init(){
#ifndef SPI_MASTER #ifndef SPI_MASTER
SPCR |= _BV(SPIE); //enable interrupts SPCR |= _BV(SPIE); //enable interrupts
#endif #endif
pos = 0;
} }
@ -116,29 +120,25 @@ void spi_mst_write_read(uint8_t len, uint8_t *data){
#ifndef SPI_MASTER #ifndef SPI_MASTER
void __attribute__((always_inline)) spi_sla_handle_packet(){ void spi_sla_handle_packet(){
// TODO: make slave not hangup in case of partial read // TODO: make slave not hangup in case of partial read
uint8_t opcode, addr, do_write; uint8_t opcode, addr, do_write;
uint16_t data; uint16_t data;
SPI_WAIT; opcode = readbuf[0];
SPDR = 0x53; // random ack addr = readbuf[1];
SPI_WAIT;
opcode = SPDR;
do_write = spi_proto_needswrite(opcode); do_write = spi_proto_needswrite(opcode);
SPI_WAIT;
addr = SPDR;
SPDR = 0x00; // buys some pause
if(do_write){ if(do_write){
data = spi_proto_handlewrite(opcode, addr); data = spi_proto_handlewrite(opcode, addr);
SPI_WAIT; writebuf[0]=opcode;
SPDR = data >> 8; writebuf[1]=addr;
SPI_WAIT; writebuf[2]=(data>>8)&0xff;
SPDR = data & 0xff; writebuf[3]=(data)&0xff;
} else { } else {
SPI_WAIT; writebuf[0]=0;
data = SPDR << 8; writebuf[1]=0;
SPI_WAIT; writebuf[2]=0;
data |= SPDR; writebuf[3]=0;
data = (readbuf[3]<<8)&0xff | readbuf[4];
spi_proto_handleread(opcode, addr, data); spi_proto_handleread(opcode, addr, data);
} }
} }
@ -146,13 +146,16 @@ void __attribute__((always_inline)) spi_sla_handle_packet(){
ISR(SPI_STC_vect){ ISR(SPI_STC_vect){
uint8_t a; SPDR = *(writebuf+pos);
a = SPDR; *(readbuf+pos) = SPDR;
SPDR = ~a; pos++;
/* SPCR &= ~(_BV(SPIE)); //disable spi interrupts if(SPI_SSIN & _BV(SPI_SS_PIN)){
spi_sla_handle_packet(); pos=0;
SPCR |= _BV(SPIE); SPCR &= ~(_BV(SPIE));
*/ sei();
spi_sla_handle_packet();
SPCR |= _BV(SPIE);
}
} }
#endif //not SPI_MASTER #endif //not SPI_MASTER

@ -16,13 +16,18 @@ void talk_to_slave(uint8_t opcode, uint8_t addr, uint8_t flags)
spi_mst_end_packet(); spi_mst_end_packet();
} }
uint16_t spi_master_communicate(uint8_t opcode, uint8_t address, uint16_t value) uint16_t spi_master_communicate(uint8_t opcode, uint8_t addr, uint16_t value)
{ {
uint8_t flags = spi_proto_needs(); uint8_t flags = spi_proto_needs(opcode);
write_data[0] = opcode;
write_data[1] = addr;
write_data[2] = value >> 8; write_data[2] = value >> 8;
write_data[3] = value & 0xff; write_data[3] = value & 0xff;
talk_to_slave(opcode, address, flags); spi_mst_write_read(4,write_data);
return (read_data[0] << 8) | read_data[1]; while(write_data[0] == 0){
spi_mst_write_read(4,write_data);
}
return (write_data[2] << 8) | read_data[3];
} }
uint8_t spi_proto_needs(uint8_t opcode) uint8_t spi_proto_needs(uint8_t opcode)

@ -9,7 +9,7 @@
#define SPI_READ_DATA 0x10 #define SPI_READ_DATA 0x10
#define SPI_NONE 0 #define SPI_NONE 0
uint16_t spi_master_communicate(uint8_t opcode, uint8_t address, uint16_t value) uint16_t spi_master_communicate(uint8_t opcode, uint8_t address, uint16_t value);
uint8_t spi_proto_needs(uint8_t opcode); uint8_t spi_proto_needs(uint8_t opcode);

@ -30,6 +30,8 @@ void softinit() {
int __attribute__((noreturn)) main(void) { int __attribute__((noreturn)) main(void) {
hardinit(); hardinit();
softinit(); softinit();
foo= 0xfafa;
bar = 0x87;
for(;;){ for(;;){

@ -3,5 +3,5 @@
#ifdef SPI_MASTER #ifdef SPI_MASTER
#undef SPI_MASTER #undef SPI_MASTER
#endif //SPI_MASTER #endif //SPI_MASTER
//#define SPI_SS_PORT D #define SPI_SS_PORT B
//#define SPI_SS_PIN 7 #define SPI_SS_PIN 2

@ -3,9 +3,23 @@
#include "main.h" #include "main.h"
uint16_t *spi_proto_globals8[] = { uint16_t *spi_proto_globals8[] = {
&foo,
&foo,
&foo,
&foo,
&foo,
&foo,
&foo &foo
}; };
uint8_t *spi_proto_globals16[] = { uint8_t *spi_proto_globals16[] = {
&bar,
&bar,
&bar,
&bar,
&bar,
&bar,
&bar,
&bar,
&bar &bar
}; };
funptr_t spi_proto_funcs[] = { funptr_t spi_proto_funcs[] = {

Loading…
Cancel
Save