#ifndef _SPI_HAL_H #define _SPI_HAL_H #pragma parameter spi_delay(__D0) extern void spi_delay(char iterations); #pragma parameter _reg_write8(__A0, __D0, __D1) extern void _reg_write8(void *addr, char data, int tmp); static inline void reg_write8(void *addr, char data) { _reg_write8(addr, data, 0); } #pragma parameter _reg_write16(__A0, __D0, __D1) extern void _reg_write16(void *addr, short data, int tmp); static inline void reg_write16(void *addr, short data) { _reg_write16(addr, data, 0); } #pragma parameter __D0 smear8to32(__D0) extern long smear8to32(char data); // Read transfer registers #define SPI_REG_RX8 ((char*) 0x00000000) // A[01:00]==2'b00, D[31:24]==ret #define SPI_REG_RX16 ((short*) 0x00000000) // A[01:00]==2'b00, D[31:16]==ret #define SPI_REG_RX16S ((short*) 0x00000000) // A[01:00]==2'b00, D[31:16]==ret #define SPI_REG_RD8 ((char*) 0x00000000) // A[01:00]==2'b00, D[31:24]==ret #define SPI_REG_RD16 ((short*) 0x00000000) // A[01:00]==2'b00, D[31:16]==ret #define SPI_REG_RD16S ((short*) 0x00000000) // A[01:00]==2'b00, D[31:16]==ret #define SPI_REG_TIMER8 ((char*) 0x00000000) // A[01:00]==2'b00, D[31:24]==ret #define SPI_REG_TIMER16 ((short*) 0x00000000) // A[01:00]==2'b00, D[31:16]==ret // Write transfer registers #define SPI_REG_TX8 ((char*) 0x00000000) // A[07:00]==arg #define SPI_REG_TX16 ((char*) 0x00000000) // A[15:00]==arg #define SPI_REG_TX16S ((char*) 0x00000000) // A[05:00]==arg #define SPI_REG_ST16 ((char*) 0x00000000) // A[15:00]==arg #define SPI_REG_EMPTY ((char*) 0x00000000) // Control/status register (read/write) #define SPI_REG_RD_CSR ((char*) 0x00000000) #define SPI_REG_WR_CSR ((char*) 0x00000000) #define SPI_REG_CSR_BIT_nDET (0) #define SPI_REG_CSR_GET_nDET() ((*SPI_REG_RD_CSR>>SPI_REG_CSR_BIT_nDET) & 1) #define SPI_REG_CSR_BIT_MISO (1) #define SPI_REG_CSR_GET_MISO() ((*SPI_REG_RD_CSR>>SPI_REG_CSR_BIT_MISO) & 1) #define SPI_REG_CSR_BIT_SCK (2) #define SPI_REG_CSR_SET_SCK() reg_write16(SPI_REG_WR_CSR, *SPI_REG_RD_CSR | (1<