/* * CC2500 helper routines */ #include #include "spi.h" #include "cc2500.h" void cc2500ReadFifo(uint8_t *dpbuffer, int len) { cc2500ReadRegisterMulti(CC2500_3F_RXFIFO | CC2500_READ_BURST, dpbuffer, len); } void cc2500ReadRegisterMulti(uint8_t address, uint8_t data[], uint8_t length) { CS_off; spiWrite(address); for (uint8_t i = 0; i < length; i++) { data[i] = spiRead(); } CS_on; } void cc2500WriteRegisterMulti(uint8_t address, const uint8_t data[], uint8_t length) { CS_off; spiWrite(CC2500_WRITE_BURST | address); for (uint8_t i = 0; i < length; i++) { spiWrite(data[i]); } CS_on; } void cc2500WriteFifo(uint8_t *dpbuffer, uint8_t len) { cc2500Strobe(CC2500_SFTX); // 0x3B cc2500WriteRegisterMulti(CC2500_3F_TXFIFO, dpbuffer, len); cc2500Strobe(CC2500_STX); // 0x35 } void cc2500WriteReg(uint8_t address, uint8_t data) { CS_off; spiWrite(address); NOP(); spiWrite(data); CS_on; } uint8_t cc2500ReadReg(uint8_t address) { uint8_t result; CS_off; address |= 0x80; // bit 7 =1 for reading spiWrite(address); result = spiRead(); CS_on; return result; } void cc2500Strobe(uint8_t address) { CS_off; spiWrite(address); CS_on; } void cc2500ResetChip(void) { // Toggle chip select signal CS_on; _delay_us(30); CS_off; _delay_us(30); CS_on; _delay_us(45); cc2500Strobe(CC2500_SRES); _delay_ms(100); }