/** * \brief Write to the FRAM chip. * \param address The index of the byte to start writing to. * \param len The number of bytes to write. * \param buf A buffer of values to write. * \return 0 on success, -1 on error * * Writes len bytes to the FRAM chip starting at address. */ int fm25lb_write(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(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); /* Send the WRITE ENABLE command to allow writing to the FRAM */ SPI_WRITE(FM25LB_WRITE_ENABLE_COMMAND); SPI_CS_SET(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); SPI_CS_CLR(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); /* Send the WRITE command and the address to the FRAM */ SPI_WRITE(FM25LB_ADD_ADDRESS_BIT(address, FM25LB_WRITE_COMMAND)); SPI_WRITE(address & 0xFF); /* Send the data to write */ for(i=0; i<len; i++) { SPI_WRITE(buf[i]); } SPI_CS_SET(FM25LB_CS_N_PORT_NUM, FM25LB_CS_N_PIN); return 0; }
/** * \brief Write to the FRAM chip. * \param address The index of the byte to start writing to. * \param len The number of bytes to write. * \param buf A buffer of values to write. * \return 0 on success, -1 on error * * Writes len bytes to the FRAM chip starting at address. */ int fm25v02_write(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 WRITE ENABLE command to allow writing to the FRAM */ SPI_WRITE(FM25V02_WRITE_ENABLE_COMMAND); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); /* Send the WRITE command and the address to the FRAM */ SPI_WRITE(FM25V02_WRITE_COMMAND); address &= 0x7fff; SPI_WRITE((address&0xff00)>>8); SPI_WRITE((address&0xff)); /* Send the data to write */ for(i=0; i<len; i++) { SPI_WRITE(buf[i]); } SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); return 0; }
int fm25v02_writeStatus(uint8_t statusReg){ // Set WEL bit in status register 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_WRITE_ENABLE_COMMAND); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_WRITE(FM25V02_WRITE_STATUS_COMMAND); SPI_WRITE(statusReg); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); return 0; }
/** * \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; }
/** * \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; }
int rv3049_set_time(rv3049_time_t* time) { uint8_t buf[8]; int i; buf[0] = rv3049_binary_to_bcd(time->seconds); buf[1] = rv3049_binary_to_bcd(time->minutes); buf[2] = rv3049_binary_to_bcd(time->hours); // 24 hour mode buf[3] = rv3049_binary_to_bcd(time->days); buf[4] = time->weekday; buf[5] = time->month; buf[6] = rv3049_binary_to_bcd(time->year - 2000); 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); // Signal a write to the clock SPI_WRITE(RV3049_SET_WRITE_BIT(RV3049_PAGE_ADDR_CLOCK)); // Write the clock values for (i=0; i<RV3049_WRITE_LEN_TIME; i++) { SPI_WRITE(buf[i]); } SPI_CS_CLR(RV3049_CS_PORT_NUM, RV3049_CS_PIN); return 0; }
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); }
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_eraseAll(){ uint16_t i; 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_WRITE_ENABLE_COMMAND); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_CS_CLR(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); SPI_WRITE(FM25V02_WRITE_COMMAND); // Address SPI_WRITE(0x00); SPI_WRITE(0x00); /* Send the data to write */ for(i=0; i<0x7fff; i++) { SPI_WRITE(0x00); } SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); }
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 rv3049_init() { /* Set the HOLD_N and WP_N pins to outputs and high */ GPIO_SET_INPUT(GPIO_PORT_TO_BASE(RV3049_INT_N_PORT_NUM), GPIO_PIN_MASK(RV3049_INT_N_PIN)); spix_cs_init(RV3049_CS_PORT_NUM, RV3049_CS_PIN); SPI_CS_CLR(RV3049_CS_PORT_NUM, RV3049_CS_PIN); // Write the initial values { rv3049_time_t start_time = {RTC_SECONDS, RTC_MINUTES, RTC_HOURS, RTC_DAYS, RTC_WEEKDAY, RTC_MONTH, RTC_YEAR}; rv3049_set_time(&start_time); } }
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; }
/*---------------------------------------------------------------------------*/ void enc28j60_arch_spi_select(void) { SPI_CS_CLR(SPI_CS_PORT, SPI_CS_PIN); }
void fm25v02_sleep(){ 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_SLEEP_COMMAND); SPI_CS_SET(FM25V02_CS_N_PORT_NUM, FM25V02_CS_N_PIN); }