|
|
|
|
@ -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 *****/
|
|
|
|
|
|