static int xmit_datablock ( /* 1:OK, 0:Failed */ const BYTE *buff, /* Ponter to 512 byte data to be sent */ BYTE token /* Token */ ) { BYTE resp; printf("xmit_datablock: inside"); if (!wait_ready(500)) { printf("xmit_datablock: not ready"); return 0; /* Wait for card ready */ } printf("xmit_datablock: ready"); TM_SPI_Send(FATFS_SPI, token); /* Send token */ if (token != 0xFD) { /* Send data if token is other than StopTran */ xmit_spi_multi(buff, 512); /* Data */ TM_SPI_Send(FATFS_SPI, 0xFF); TM_SPI_Send(FATFS_SPI, 0xFF); /* Dummy CRC */ resp = TM_SPI_Send(FATFS_SPI, 0xFF); /* Receive data resp */ if ((resp & 0x1F) != 0x05) /* Function fails if the data packet was not accepted */ return 0; } return 1; }
uint8_t TM_NRF24L01_ReadRegister(uint8_t reg) { uint8_t value; NRF24L01_CSN_LOW; TM_SPI_Send(NRF24L01_SPI, NRF24L01_READ_REGISTER_MASK(reg)); value = TM_SPI_Send(NRF24L01_SPI, NRF24L01_NOP_MASK); NRF24L01_CSN_HIGH; return value; }
void TM_L3GD20_INT_WriteSPI(uint8_t address, uint8_t data) { /* CS low */ L3GD20_CS_LOW; /* Send address with write command */ TM_SPI_Send(L3GD20_SPI, address); /* Write data */ TM_SPI_Send(L3GD20_SPI, data); /* CS high */ L3GD20_CS_HIGH; }
void TM_MFRC522_WriteRegister(uint8_t addr, uint8_t val) { //CS low MFRC522_CS_LOW; //Send address TM_SPI_Send(MFRC522_SPI, (addr << 1) & 0x7E); //Send data TM_SPI_Send(MFRC522_SPI, val); //CS high MFRC522_CS_HIGH; }
uint8_t TM_MFRC522_ReadRegister(uint8_t addr) { uint8_t val; //CS low MFRC522_CS_LOW; TM_SPI_Send(MFRC522_SPI, ((addr << 1) & 0x7E) | 0x80); val = TM_SPI_Send(MFRC522_SPI, MFRC522_DUMMY); //CS high MFRC522_CS_HIGH; return val; }
uint8_t TM_L3GD20_INT_ReadSPI(uint8_t address) { uint8_t data; /* CS low */ L3GD20_CS_LOW; /* Send address with read command */ TM_SPI_Send(L3GD20_SPI, address | 0x80); /* Read data */ data = TM_SPI_Send(L3GD20_SPI, 0xFF); /* CS high */ L3GD20_CS_HIGH; /* Return data */ return data; }
void TM_PCD8544_Send(uint8_t data) { /* CE low */ PCD8544_CE_LOW; /* Send data */ TM_SPI_Send(PCD8544_SPI, data); /* CE high */ PCD8544_CE_HIGH; }
static BYTE send_cmd ( /* Return value: R1 resp (bit7==1:Failed to send) */ BYTE cmd, /* Command index */ DWORD arg /* Argument */ ) { BYTE n, res; if (cmd & 0x80) { /* Send a CMD55 prior to ACMD<n> */ cmd &= 0x7F; res = send_cmd(CMD55, 0); if (res > 1) return res; } /* Select the card and wait for ready except to stop multiple block read */ if (cmd != CMD12) { deselect(); if (!select()) return 0xFF; } /* Send command packet */ TM_SPI_Send(FATFS_SPI, 0x40 | cmd); /* Start + command index */ TM_SPI_Send(FATFS_SPI, (BYTE)(arg >> 24)); /* Argument[31..24] */ TM_SPI_Send(FATFS_SPI, (BYTE)(arg >> 16)); /* Argument[23..16] */ TM_SPI_Send(FATFS_SPI, (BYTE)(arg >> 8)); /* Argument[15..8] */ TM_SPI_Send(FATFS_SPI, (BYTE)arg); /* Argument[7..0] */ n = 0x01; /* Dummy CRC + Stop */ if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */ if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */ TM_SPI_Send(FATFS_SPI, n); /* Receive command resp */ if (cmd == CMD12) { TM_SPI_Send(FATFS_SPI, 0xFF); /* Diacard following one byte when CMD12 */ } n = 10; /* Wait for response (10 bytes max) */ do { res = TM_SPI_Send(FATFS_SPI, 0xFF); } while ((res & 0x80) && --n); return res; /* Return received response */ }
uint8_t TM_NRF24L01_GetStatus(void) { uint8_t status; NRF24L01_CSN_LOW; /* First received byte is always status register */ status = TM_SPI_Send(NRF24L01_SPI, NRF24L01_NOP_MASK); /* Pull up chip select */ NRF24L01_CSN_HIGH; return status; }
void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t* dataIn, uint8_t dummy, uint16_t count) { uint16_t i; //for (i = 0; i < count; i++) { for (i = 0; i < 512; i++) { if(count > 512){ //GO_FUCKING_APESHIT// //GPIO_ToggleBits(GPIOD,(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)); count = 512; } dataIn[i] = TM_SPI_Send(SPIx, dummy); } }
int main(void) { //180MHz clock SystemInit(); //Initialize SPI TM_SPI1_Init(TM_SPI_PinsPack_1); //Send 0x15 over SPI1 TM_SPI_Send(SPI1, 0x15); while(1) { } }
void TM_NRF24L01_GetData(uint8_t* data) { /* Pull down chip select */ NRF24L01_CSN_LOW; /* Send read payload command*/ TM_SPI_Send(NRF24L01_SPI, NRF24L01_R_RX_PAYLOAD_MASK); /* Read payload */ TM_SPI_SendMulti(NRF24L01_SPI, data, data, TM_NRF24L01_Struct.PayloadSize); /* Pull up chip select */ NRF24L01_CSN_HIGH; /* Reset status register, clear RX_DR interrupt flag */ TM_NRF24L01_WriteRegister(NRF24L01_REG_STATUS, (1 << NRF24L01_RX_DR)); }
static int select (void) /* 1:OK, 0:Timeout */ { GPIO_ResetBits(SD_CARD_CS_PORT, SD_CARD_CS_PIN); //CS to high TM_SPI_Send(FATFS_SPI, 0xFF); /* Dummy clock (force DO enabled) */ if (wait_ready(500)) { printf("select: OK"); return 1; /* OK */ } printf("select: no"); deselect(); return 0; /* Timeout */ }
static int rcvr_datablock ( /* 1:OK, 0:Error */ BYTE *buff, /* Data buffer */ UINT btr /* Data block length (byte) */ ) { BYTE token; //Timer1 = 200; set_timems(200); do { // Wait for DataStart token in timeout of 200ms token = TM_SPI_Send(FATFS_SPI, 0xFF); // This loop will take a time. Insert rot_rdq() here for multitask envilonment. } while ((token == 0xFF) && check_time()); if (token != 0xFE) { printf("rcvr_datablock: token != 0xFE"); return 0; // Function fails if invalid DataStart token or timeout } rcvr_spi_multi(buff, btr); // Store trailing data to the buffer TM_SPI_Send(FATFS_SPI, 0xFF); TM_SPI_Send(FATFS_SPI, 0xFF); // Discard CRC return 1; // Function succeeded }
static int wait_ready ( /* 1:Ready, 0:Timeout */ UINT wt /* Timeout [ms] */ ) { BYTE d; /* Set down counter */ set_timems(wt); do { d = TM_SPI_Send(FATFS_SPI, 0xFF); } while (d != 0xFF && check_time()); /* Wait for card goes ready or timeout */ if (d == 0xFF) { FATFS_DEBUG_SEND_USART("wait_ready: OK"); } else { FATFS_DEBUG_SEND_USART("wait_ready: timeout"); } return (d == 0xFF) ? 1 : 0; }
void TM_NRF24L01_Transmit(uint8_t *data) { uint8_t count = TM_NRF24L01_Struct.PayloadSize; /* Chip enable put to low, disable it */ NRF24L01_CE_LOW; /* Go to power up tx mode */ TM_NRF24L01_PowerUpTx(); /* Clear TX FIFO from NRF24L01+ */ NRF24L01_FLUSH_TX; /* Send payload to nRF24L01+ */ NRF24L01_CSN_LOW; /* Send write payload command */ TM_SPI_Send(NRF24L01_SPI, NRF24L01_W_TX_PAYLOAD_MASK); /* Fill payload with data*/ TM_SPI_WriteMulti(NRF24L01_SPI, data, count); /* Disable SPI */ NRF24L01_CSN_HIGH; /* Send data! */ NRF24L01_CE_HIGH; }
void TM_NRF24L01_Transmit(uint8_t *data) { uint8_t count = TM_NRF24L01_Struct.PayloadSize; //Chip enable put to low, disable it NRF24L01_CE_LOW; //Go to power up tx mode TM_NRF24L01_PowerUpTx(); //Clear TX FIFO from NRF24L01+ NRF24L01_FLUSH_TX; //Send payload to nRF24L01+ NRF24L01_CSN_LOW; //Send write payload command TM_SPI_Send(NRF24L01_SPI, NRF24L01_W_TX_PAYLOAD_MASK); //Fill payload with data TM_SPI_WriteMulti(NRF24L01_SPI, data, count); NRF24L01_CSN_HIGH; //Delay(1000); //Send data! NRF24L01_CE_HIGH; }
void TM_NRF24L01_WriteRegisterMulti(uint8_t reg, uint8_t *data, uint8_t count) { NRF24L01_CSN_LOW; TM_SPI_Send(NRF24L01_SPI, NRF24L01_WRITE_REGISTER_MASK(reg)); TM_SPI_WriteMulti(NRF24L01_SPI, data, count); NRF24L01_CSN_HIGH; }
void TM_NRF24L01_WriteRegister(uint8_t reg, uint8_t value) { NRF24L01_CSN_LOW; TM_SPI_Send(NRF24L01_SPI, NRF24L01_WRITE_REGISTER_MASK(reg)); TM_SPI_Send(NRF24L01_SPI, value); NRF24L01_CSN_HIGH; }
void TM_NRF24L01_ReadRegisterMulti(uint8_t reg, uint8_t* data, uint8_t count) { NRF24L01_CSN_LOW; TM_SPI_Send(NRF24L01_SPI, NRF24L01_READ_REGISTER_MASK(reg)); TM_SPI_ReadMulti(NRF24L01_SPI, data, NRF24L01_NOP_MASK, count); NRF24L01_CSN_HIGH; }
void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t *dataIn, uint8_t dummy, uint16_t count) { uint16_t i; for (i = 0; i < count; i++) { dataIn[i] = TM_SPI_Send(SPIx, dummy); } }
void TM_SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t* dataOut, uint16_t count) { uint16_t i; for (i = 0; i < count; i++) { TM_SPI_Send(SPIx, dataOut[i]); } }
static void TM_ILI9341_SendData(uint8_t data) { ILI9341_WRX_SET; ILI9341_CS_RESET; TM_SPI_Send(ILI9341_SPI, data); ILI9341_CS_SET; }
void TM_ILI9341_SendCommand(uint8_t data) { ILI9341_WRX_RESET; ILI9341_CS_RESET; TM_SPI_Send(ILI9341_SPI, data); ILI9341_CS_SET; }
void PCD8544_send(unsigned char data) { PCD8544_CE_LOW; TM_SPI_Send(PCD8544_SPIx, data); PCD8544_CE_HIGH; }
static void deselect (void) { GPIO_SetBits(SD_CARD_CS_PORT, SD_CARD_CS_PIN); //CS to high TM_SPI_Send(FATFS_SPI, 0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */ printf("Deselect:ok"); }