You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.0 KiB

#include "spi_proto.h"
#include "spi.h"
#ifndef SPI_MASTER
#include "main.h"
#include "filter.h"
#endif
/***** MASTER *****/
uint8_t mst_buf[5];
uint16_t spi_master_transceive(uint8_t opcode, uint8_t addr, uint16_t value)
{
// for(uint8_t j=0; j<10; ++j){
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();
spi_mst_packet_delay();
for(uint8_t i=0; i<5; ++i){
mst_buf[0] = 0;
mst_buf[1] = 0;
mst_buf[2] = 0;
mst_buf[3] = 0;
mst_buf[4] = 0;
spi_mst_start_packet();
spi_mst_write_read(5,mst_buf);
spi_mst_end_packet();
// bytes from slave are received shifted right by one
if(mst_buf[1] == opcode && mst_buf[2] == addr){ // valid answer
return ((mst_buf[3] << 8) | mst_buf[4]);
}
spi_mst_packet_delay();
}
// }
return 0xffff; // error-code
}
uint16_t read_temperature(uint8_t number)
{
return 0;
}
uint8_t read_var8(uint8_t number)
{
return 0;
}
uint16_t read_var16(uint8_t number)
{
return 0;
}
void write_var8(uint8_t number, uint8_t value)
{
}
void write_var16(uint8_t number, uint16_t value)
{
}
void call_func(uint8_t number)
{
}
/***** MASTER END *****/
/***** SLAVE *****/
uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data) {
uint16_t retval = 0;
switch(opcode){
case 1:
retval = data;
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:
retval = (*spi_proto_funcs[addr])(data);
//TODO: prevent a function from being run several times because the message gets repeated.
break;
case 7:
#ifndef SPI_MASTER
retval = get_temperature(addr);
#endif
break;
default:
break;
}
return retval;
}
/***** SLAVE END *****/