void XSPI_PutByte(uint8_t out) { for(uint8_t i = 0; i < 8; i++) { if(out & (1 << i)) PINHIGH(SPIPORT, MOSI); else PINLOW(SPIPORT, MOSI); PINHIGH(SPIPORT, SCK); PINLOW(SPIPORT, SCK); } }
void XSPI_LeaveFlashmode(void) { PINHIGH(SPIPORT, SS); PINLOW(SPIPORT, EJ); _delay_ms(50); PINLOW(SPIPORT, XX); PINHIGH(SPIPORT, EJ); }
void XSPI_Shutdown(void) { PINHIGH(SPIPORT, SS); PINLOW(SPIPORT, XX); PINLOW(SPIPORT, EJ); _delay_ms(50); PINHIGH(SPIPORT, EJ); }
void XSPI_Init(void) { PINOUT(SPIDDR, KSK); PINOUT(SPIDDR, EJ); PINOUT(SPIDDR, XX); PINOUT(SPIDDR, SS); PINOUT(SPIDDR, SCK); PINOUT(SPIDDR, MOSI); PINHIGH(SPIPORT, EJ); PINHIGH(SPIPORT, SS); PINHIGH(SPIPORT, XX); PINHIGH(SPIPORT, SCK); PINHIGH(SPIPORT, KSK); PINLOW(SPIPORT, MOSI); }
void XSPI_Powerup(void) { PINLOW(SPIPORT, KSK); _delay_ms(5); PINHIGH(SPIPORT, KSK); _delay_ms(5); PINLOW(SPIPORT, KSK); _delay_ms(5); PINHIGH(SPIPORT, KSK); _delay_ms(5); PINLOW(SPIPORT, KSK); _delay_ms(5); PINHIGH(SPIPORT, KSK); _delay_ms(5); PINLOW(SPIPORT, KSK); _delay_ms(5); PINHIGH(SPIPORT, KSK); }
uint8 set_relay_state(uint8 chan,uint8 val){ if (chan >= NUM_RELAY_CHANNELS) return 0; //FIXME should be error if ( val == 0 ){ _relay_state &= (uint8)(~( 1 << chan )); if (chan == 0 ) { PINLOW(RLA); } else if (chan == 1){ PINLOW(RLB); } } else { _relay_state |= (uint8)( 1 << chan ); if (chan == 0 ) { PINHIGH(RLA); } else if (chan == 1){ PINHIGH(RLB); } } return 0; }
void XSPI_Write(uint8_t reg, uint8_t* buf) { PINLOW(SPIPORT, SS); XSPI_PutByte((reg << 2) | 2); XSPI_PutByte(*buf++); XSPI_PutByte(*buf++); XSPI_PutByte(*buf++); XSPI_PutByte(*buf++); PINHIGH(SPIPORT, SS); }
void XSPI_Read(uint8_t reg, uint8_t* buf) { PINLOW(SPIPORT, SS); XSPI_PutByte((reg << 2) | 1); XSPI_PutByte(0xFF); *buf++ = XSPI_FetchByte(); *buf++ = XSPI_FetchByte(); *buf++ = XSPI_FetchByte(); *buf++ = XSPI_FetchByte(); PINHIGH(SPIPORT, SS); }
uint8_t XSPI_FetchByte() { uint8_t in = 0; PINLOW(SPIPORT, MOSI); for(uint8_t i = 0; i < 8; i++) { PINHIGH(SPIPORT, SCK); in |= PINGET(SPIPIN, MISO) ? (1 << i) : 0x00; PINLOW(SPIPORT, SCK); } return in; }
uint8_t XSPI_ReadByte(uint8_t reg) { uint8_t res; PINLOW(SPIPORT, SS); XSPI_PutByte((reg << 2) | 1); XSPI_PutByte(0xFF); res = XSPI_FetchByte(); PINHIGH(SPIPORT, SS); return res; }
uint16_t XSPI_ReadWord(uint8_t reg) { uint16_t res; PINLOW(SPIPORT, SS); XSPI_PutByte((reg << 2) | 1); XSPI_PutByte(0xFF); res = XSPI_FetchByte(); res |= ((uint16_t)XSPI_FetchByte()) << 8; PINHIGH(SPIPORT, SS); return res; }