/** * \brief Read from the FRAM chip. * \param address The index of the byte to start reading from. * \param len The number of bytes to read. * \param buf A buffer to put the return data in. * \return 0 on success, -1 on error * * Reads len bytes from the FRAM chip starting at address. */ int fm25lb_read(uint16_t address, uint16_t len, uint8_t *buf) { uint16_t i; // uint16_t c; // uint16_t cycles = (len / 6) + 1; // uint16_t index = 0; uint16_t current_address = address; spi_set_mode(SSI_CR0_FRF_MOTOROLA, SSI_CR0_SPO, SSI_CR0_SPH, 8); SPI_CS_CLR(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); /* Send the READ command and the address to the FRAM */ SPI_WRITE(FM25LB_ADD_ADDRESS_BIT(current_address, FM25LB_READ_COMMAND)); SPI_WRITE(current_address & 0xFF); SPI_FLUSH(); for (i=0; i<len; i++) { SPI_READ(buf[i]); } SPI_CS_SET(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); return 0; }
/*---------------------------------------------------------------------------*/ int xmem_pread(void *_p, int size, unsigned long offset) { unsigned char *p = _p; const unsigned char *end = p + size; int s; wait_ready(); ENERGEST_ON(ENERGEST_TYPE_FLASH_READ); s = splhigh(); SPI_FLASH_ENABLE(); SPI_WRITE_FAST(SPI_FLASH_INS_READ); SPI_WRITE_FAST(offset >> 16); /* MSB */ SPI_WRITE_FAST(offset >> 8); SPI_WRITE_FAST(offset >> 0); /* LSB */ SPI_WAITFORTx_ENDED(); SPI_FLUSH(); for(; p < end; p++) { unsigned char u; SPI_READ(u); *p = ~u; } SPI_FLASH_DISABLE(); splx(s); ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ); return size; }
/** * \brief Read from the FRAM chip. * \param address The index of the byte to start reading from. * \param len The number of bytes to read. * \param buf A buffer to put the return data in. * \return 0 on success, -1 on error * * Reads len bytes from the FRAM chip starting at address. */ int fm25v02_read(uint16_t address, uint16_t len, uint8_t *buf) { uint16_t i; spi_set_mode(SSI_CR0_FRF_MOTOROLA, SSI_CR0_SPO, SSI_CR0_SPH, 8); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); /* Send the READ command and the address to the FRAM */ SPI_WRITE(FM25V02_READ_COMMAND); address &= 0x7fff; SPI_WRITE((address&0xff00)>>8); SPI_WRITE((address&0xff)); SPI_FLUSH(); for (i=0; i<len; i++) { SPI_READ(buf[i]); } SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); return 0; }
uint8_t fm25v02_readStatus(){ uint8_t statusReg; spi_set_mode(SSI_CR0_FRF_MOTOROLA, 0, 0, 8); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_WRITE(FM25V02_READ_STATUS_COMMAND); SPI_FLUSH(); SPI_READ(statusReg); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); return statusReg; }
void fm25v02_dummyWakeup(){ uint8_t dummyReg; //uint16_t dummyCnt; spi_set_mode(SSI_CR0_FRF_MOTOROLA, 0, 0, 8); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); // Delay for 400-ish us clock_delay_usec(400); //for (dummyCnt=0; dummyCnt<800; dummyCnt++) // asm("nop"); SPI_FLUSH(); SPI_READ(dummyReg); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); }
void nrf51822_get_all_advertisements () { //spi_set_mode(SSI_CR0_FRF_MOTOROLA, SSI_CR0_SPO, SSI_CR0_SPH, 8); spi_set_mode(SSI_CR0_FRF_MOTOROLA, 0, 0, 8); SPI_CS_CLR(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); clock_delay_usec(8); // GET ADVERTISEMENTS SPI_WRITE(0x02); SPI_FLUSH(); SPI_CS_SET(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); }
void nrf51822_interrupt(uint8_t port, uint8_t pin) { uint16_t b; uint8_t buf[256]; int i; leds_toggle(LEDS_RED); spi_set_mode(SSI_CR0_FRF_MOTOROLA, 0, 0, 8); SPI_CS_CLR(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); clock_delay_usec(8); // READ_IRQ SPI_WRITE(0x01); SPI_FLUSH(); SPI_CS_SET(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); clock_delay_usec(75); SPI_CS_CLR(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); clock_delay_usec(8); SPI_READ(b); if (b == 0xFF) { // ERROR on the nrf51822 side. Skip this. } else { for (i=0; i<b; i++) { SPI_READ(buf[i]); } } SPI_CS_SET(NRF51822_CS_N_PORT_NUM, NRF51822_CS_N_PIN); }
/*---------------------------------------------------------------------------*/ static unsigned read_status_register(void) { unsigned char u; int s; s = splhigh(); SPI_FLASH_ENABLE(); SPI_WRITE(SPI_FLASH_INS_RDSR); SPI_FLUSH(); SPI_READ(u); SPI_FLASH_DISABLE(); splx(s); return u; }
int rv3049_read_time(rv3049_time_t* time) { uint8_t buf[8]; int i; spix_set_mode(SPI_CONF_DEFAULT_INSTANCE, SSI_CR0_FRF_MOTOROLA, 0, SSI_CR0_SPH, 8); SPI_CS_SET(RV3049_CS_PORT_NUM, RV3049_CS_PIN); // Tell the RTC we want to read the clock SPI_WRITE(RV3049_SET_READ_BIT(RV3049_PAGE_ADDR_CLOCK)); SPI_FLUSH(); // Read a null byte here. Not exactly sure why. SPI_READ(buf[0]); // Then actually read the clock for (i=0; i<RV3049_READ_LEN_TIME; i++) { SPI_READ(buf[i]); } SPI_CS_CLR(RV3049_CS_PORT_NUM, RV3049_CS_PIN); // Convert the values time->seconds = BCD_TO_BINARY(buf[0]); time->minutes = BCD_TO_BINARY(buf[1]); time->hours = BCD_TO_BINARY((buf[2])&0x3F); time->days = BCD_TO_BINARY(buf[3]); time->weekday = buf[4]; time->month = buf[5]; time->year = BCD_TO_BINARY(buf[6])+2000; return 0; }