#if ARDUINO >= 165 #include #endif #if 0 #elif defined(__AVR_ATmega328P__) #define SPI_INIT() { DDRB |= (1<<5)|(1<<3)|(1<<2); SPCR = (1<>8, l = x; write8(h); write8(l); } #define READ_8(dst) { dst = xchg8(0); } #define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } #define PIN_LOW(p, b) (p) &= ~(1<<(b)) #define PIN_HIGH(p, b) (p) |= (1<<(b)) #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) #elif defined(__SAMD21G18A__) #define SPI_INIT() { SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(6); } #define CD_PORT PORT->Group[0] #define CD_PIN 7 #define CS_PORT PORT->Group[0] #define CS_PIN 18 #define RESET_PORT PORT->Group[0] #define RESET_PIN 6 #define RD_IDLE #define WR_IDLE uint8_t running; static inline void write8(uint8_t c) { running = 1; while( SERCOM1->SPI.INTFLAG.bit.DRE == 0) ; SERCOM1->SPI.DATA.bit.DATA = c; // Writing data into Data register } static inline void flush(void) { if (running) while( SERCOM1->SPI.INTFLAG.bit.TXC == 0) ; running = 0; } static inline uint8_t xchg8(uint8_t c) { // flush(); while( SERCOM1->SPI.INTFLAG.bit.RXC != 0) SERCOM1->SPI.DATA.bit.DATA; //eat up while( SERCOM1->SPI.INTFLAG.bit.DRE == 0) ; SERCOM1->SPI.DATA.bit.DATA = c; // Writing data into Data register while( SERCOM1->SPI.INTFLAG.bit.RXC == 0) ; return SERCOM1->SPI.DATA.bit.DATA; } #define setWriteDir() { } #define setReadDir() { } //#define flush() //#define write8(x) xchg8(x) //#define xchg8(x) SPI.transfer(x) #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } #define READ_8(dst) { dst = xchg8(0); } #define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } // Shield Control macros. #define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) #define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) #define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) #elif defined(__AVR_ATxmega128A1__) //3.49s @ 32MHz -O2 #define CD_PORT VPORT2 #define CD_PIN 1 #define CS_PORT VPORT3 #define CS_PIN 4 #define RESET_PORT VPORT2 #define RESET_PIN 0 #define SPCRVAL (USART_CLK2X_bm | USART_RXEN_bm | USART_TXEN_bm) #define SETDDR {VPORT3.DIR |= (1<<4)|(1<<5)|(1<<7); VPORT2.DIR |= 0x03; } #define SPI_INIT() { PORTCFG.VPCTRLB=PORTCFG_VP3MAP_PORTF_gc | PORTCFG_VP2MAP_PORTC_gc; CS_IDLE; RESET_IDLE; SETDDR; spi_init(); } void spi_init(void) { SPIF.CTRL=SPI_ENABLE_bm | SPI_MODE_3_gc | (1<>8, l = x; write8(h); write8(l); } #define READ_8(dst) { dst = xchg8(0); } #define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } #define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) #define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) #define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) #endif #define CD_COMMAND {flush(); PIN_LOW(CD_PORT, CD_PIN); } #define CD_DATA {flush(); PIN_HIGH(CD_PORT, CD_PIN); } #define CD_OUTPUT PIN_OUTPUT(CD_PORT, CD_PIN) #define CS_ACTIVE PIN_LOW(CS_PORT, CS_PIN) #define CS_IDLE {flush(); PIN_HIGH(CS_PORT, CS_PIN); } #define CS_OUTPUT PIN_OUTPUT(CS_PORT, CS_PIN) #define RESET_ACTIVE PIN_LOW(RESET_PORT, RESET_PIN) #define RESET_IDLE PIN_HIGH(RESET_PORT, RESET_PIN) #define RESET_OUTPUT PIN_OUTPUT(RESET_PORT, RESET_PIN) // General macros. IOCLR registers are 1 cycle when optimised. #define CTL_INIT() { CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; SPI_INIT(); } #define WriteCmd(x) { CD_COMMAND; write8(x); } #define WriteData(x) { CD_DATA; write16(x); }