void ZigBee_WriteReg(uint8_t addr, uint8_t val) { SPI_TypeDef* SPI = MAKENAME(SPI,ZIGBEE_SPI); //read off any remaining bytes while(SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)) SPI_ReceiveData8(SPI); //enable NSS pin PullDown(); _delay_us(1); //wait until TX buffer is empty while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE)); uint8_t cmd = addr; cmd |= 0xC0; // write cmd SPI_SendData8(SPI, cmd); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); SPI_ReceiveData8(SPI); SPI_SendData8(SPI, val); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); SPI_ReceiveData8(SPI); _delay_us(1); PullUp(); }
void ZigBee_ReadFrame(uint8_t * data, uint8_t * len) { uint8_t resp; SPI_TypeDef* SPI = MAKENAME(SPI,ZIGBEE_SPI); //read off any bytes in the buffer while(SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); //enable select pin PullDown(); _delay_us(1); //wait until TX buffer is empty while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE)); //send the read command SPI_SendData8(SPI, 0x20); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); //receive the buffer length SPI_SendData8(SPI, 0); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); uint8_t nbytes = resp+3; //packet + lqi + ed + status (link quality indicatior) (energy detection) *len = nbytes; //set the return value // Datasheet says max buffer access is 5 + frame length = 132 // 2 reads come before frame, 3 after // First 2 reads not included in nbytes // Therefore, max nbytes size is 132 - 2 = 130 if (nbytes > 130) { *len = 0; _delay_us(1); PullUp(); return; } for (uint8_t ii=0; ii<nbytes; ii++) { SPI_SendData8(SPI, 0); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); //receive data *data++ = resp; } _delay_us(1); PullUp(); }
uint8_t ZigBee_WriteFrame(const void* data, uint8_t len) { if (len > MAX_ZIGBEE_PACKET_BYTES) return -1; SPI_TypeDef* SPI = MAKENAME(SPI,ZIGBEE_SPI); const uint8_t *tx_ptr = data; //clear any remaining bytes while(SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)) SPI_ReceiveData8(SPI); PullDown(); _delay_us(1); //wait until TX buffer is empty while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE)); SPI_SendData8(SPI, 0x60); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); SPI_ReceiveData8(SPI); SPI_SendData8(SPI, len+2); //two extra bytes for the 16-bit CRC while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); SPI_ReceiveData8(SPI); for(int ii = 0; ii < len; ii++) { SPI_SendData8(SPI, tx_ptr[ii]); while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); SPI_ReceiveData8(SPI); } _delay_us(1); PullUp(); ZigBee_WriteReg(REG_TRX_STATE, 0x02); //alternate method for signaling to send return 0; }
void ZigBee_ReadReg(uint8_t addr, uint8_t len, uint8_t * dest) { uint8_t resp; SPI_TypeDef* SPI = MAKENAME(SPI,ZIGBEE_SPI); //read off any remaining bytes while(SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)) resp = SPI_ReceiveData8(SPI); PullDown(); _delay_us(1); for(uint8_t ii=0; ii<len; ii++) { //wait until TX buffer is empty while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE)); uint8_t cmd = addr; cmd |= 0x80; // read cmd SPI_SendData8(SPI, cmd); //send the command while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); //this is PHY_STATUS byte from ZigBee SPI_SendData8(SPI, 0); // send dummy while(!SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE)); resp = SPI_ReceiveData8(SPI); *dest++ = resp; } _delay_us(1); PullUp(); }
void GPIO_PORT::SetupGPIO_InPullDown (GPIO_PIN_N pin) { *_pGPIO_MODER &= ~(3<<pin*2); *_pGPIO_MODER |= GPIO_MODE_IN<<pin*2; PullDown(pin); }