void main () { hBSP430halSERIAL console = NULL; hBSP430halSERIAL uart = NULL; unsigned long prep_utt = 0; unsigned long emit_utt = 0; unsigned long done_utt = 0; vBSP430platformInitialize_ni(); iBSP430consoleInitialize(); console = hBSP430console(); cprintf("\ntxcb " __DATE__ " " __TIME__ "\n"); cprintf("\nConsole %p is on %s: %s\n", console, xBSP430serialName(BSP430_CONSOLE_SERIAL_PERIPH_HANDLE), xBSP430platformPeripheralHelp(BSP430_CONSOLE_SERIAL_PERIPH_HANDLE, 0)); uart = hBSP430serialLookup(UART_PERIPH_HANDLE); if (NULL == uart) { cprintf("Failed to resolve secondary\n"); return; } cprintf("\nSecondary %p is on %s: %s\n", uart, xBSP430serialName(UART_PERIPH_HANDLE), xBSP430platformPeripheralHelp(UART_PERIPH_HANDLE, 0)); tx_buffer_.head = tx_buffer_.tail = 0; BSP430_HAL_ISR_CALLBACK_LINK_NI(sBSP430halISRVoidChainNode, uart->tx_cbchain_ni, tx_buffer_.cb_node, next_ni); uart = hBSP430serialOpenUART(uart, 0, 0, 9600); if (NULL == uart) { cprintf("Secondary open failed\n"); } /* Need to enable interrupts so timer overflow events are properly * acknowledged */ BSP430_CORE_ENABLE_INTERRUPT(); while (1) { unsigned long next_prep_utt; char * obp; char * ob_end; next_prep_utt = ulBSP430uptime(); obp = tx_buffer_.buffer; ob_end = obp + sizeof(tx_buffer_.buffer); obp += snprintf(obp, ob_end - obp, "prep %lu emit %lu\r\n", emit_utt - prep_utt, done_utt - emit_utt); ob_end = obp; BSP430_CORE_DISABLE_INTERRUPT(); emit_utt = ulBSP430uptime_ni(); prep_utt = next_prep_utt; tx_buffer_.tail = 0; tx_buffer_.head = obp - tx_buffer_.buffer; vBSP430serialWakeupTransmit_ni(uart); BSP430_CORE_LPM_ENTER_NI(LPM0_bits); /* Expect tail == head otherwise should not have awoken */ done_utt = ulBSP430uptime(); } }
void main () { hBSP430halSERIAL i2c; sBSP430bq24210 bq24210; union { sBQ27510 state; uint16_t raw[1]; } u; const int nwords = sizeof(u.state)/sizeof(u.raw[0]); unsigned long resample_interval_utt; unsigned long resample_wake_utt; unsigned int flags; int rc; vBSP430platformInitialize_ni(); (void)iBSP430consoleInitialize(); cprintf("\nbattpack " __DATE__ " " __TIME__ "\n"); bq24210.chg_port = xBSP430hplLookupPORT(APP_CHGn_PORT_PERIPH_HANDLE); bq24210.en_port = xBSP430hplLookupPORT(APP_ENn_PORT_PERIPH_HANDLE); bq24210.pg_port = xBSP430hplLookupPORT(APP_PGn_PORT_PERIPH_HANDLE); bq24210.chg_bit = APP_CHGn_PORT_BIT; bq24210.en_bit = APP_ENn_PORT_BIT; bq24210.pg_bit = APP_PGn_PORT_BIT; cprintf("CHGn on %s.%u\n", xBSP430portName(xBSP430periphFromHPL(bq24210.chg_port)), iBSP430portBitPosition(bq24210.chg_bit)); cprintf("ENn on %s.%u\n", xBSP430portName(xBSP430periphFromHPL(bq24210.en_port)), iBSP430portBitPosition(bq24210.en_bit)); cprintf("PGn on %s.%u\n", xBSP430portName(xBSP430periphFromHPL(bq24210.pg_port)), iBSP430portBitPosition(bq24210.pg_bit)); if (! (bq24210.chg_port && bq24210.en_port && bq24210.pg_port)) { cprintf("One of the ports is missing\n"); return; } /* Charge signal is an input (active low) to the MCU. Configure as * input with internal pull-up. */ bq24210.chg_port->dir &= ~bq24210.chg_bit; bq24210.chg_port->out |= bq24210.chg_bit; bq24210.chg_port->ren |= bq24210.chg_bit; /* Power-good signal is an input (active low) to the MCU. Configure * as input with internal pull-up. */ bq24210.pg_port->dir &= ~bq24210.pg_bit; bq24210.pg_port->out |= bq24210.pg_bit; bq24210.pg_port->ren |= bq24210.pg_bit; /* Enable signal is an output (active low) from the MCU. Start * active. */ bq24210.en_port->out &= ~bq24210.en_bit; bq24210.en_port->dir |= bq24210.en_bit; cprintf("I2C on %s at address 0x%02x\nPins: %s\n", xBSP430serialName(APP_BQ27510_I2C_PERIPH_HANDLE), APP_BQ27510_I2C_ADDRESS, xBSP430platformPeripheralHelp(APP_BQ27510_I2C_PERIPH_HANDLE, BSP430_PERIPHCFG_SERIAL_I2C)); /* NOTE: At default BSP430_SERIAL_I2C_BUS_SPEED_HZ 400kHz this * devices supports only single-byte write operations. Further, * ensure a 66us delay between packets. */ i2c = hBSP430serialOpenI2C(hBSP430serialLookup(APP_BQ27510_I2C_PERIPH_HANDLE), BSP430_SERIAL_ADJUST_CTL0_INITIALIZER(UCMST), 0, 0); if (! i2c) { cprintf("I2C open failed\n"); return; } (void)iBSP430i2cSetAddresses_rh(i2c, -1, APP_BQ27510_I2C_ADDRESS); resample_interval_utt = BSP430_UPTIME_MS_TO_UTT(1000UL * RESAMPLE_INTERVAL_S); resample_wake_utt = ulBSP430uptime_ni(); flags = FLG_DUMP_STATE | FLG_UPDATE_INTERVAL; BSP430_CORE_ENABLE_INTERRUPT(); while (1) { char astext_buf[BSP430_UPTIME_AS_TEXT_LENGTH]; uint16_t temperature_dC; if (FLG_DUMP_STATE & flags) { memset(&u, 0, sizeof(u)); rc = readBQ27510(i2c, 0, nwords, u.raw); cprintf("Device ID %04x rc %d\n", u.state.device_id, rc); cprintf("%.30s = %d\n", "atRate_mA", u.state.atRate_mA); cprintf("%.30s = %u\n", "atRatetimeToEmpty_min", u.state.atRatetimeToEmpty_min); cprintf("%.30s = %u\n", "temperature_dK", u.state.temperature_dK); cprintf("%.30s = %u\n", "voltage_mV", u.state.voltage_mV); cprintf("%.30s = 0x%04x\n", "flags", u.state.flags); cprintf("%.30s = %u\n", "nominalAvailableCapacity_mAh", u.state.nominalAvailableCapacity_mAh); cprintf("%.30s = %u\n", "fullAvailableCapacity_mAh", u.state.fullAvailableCapacity_mAh); cprintf("%.30s = %u\n", "remainingCapacity_mAh", u.state.remainingCapacity_mAh); cprintf("%.30s = %u\n", "fullChargeCapacity_mAh", u.state.fullChargeCapacity_mAh); cprintf("%.30s = %d\n", "averageCurrent_mA", u.state.averageCurrent_mA); cprintf("%.30s = %u\n", "timeToEmpty_min", u.state.timeToEmpty_min); cprintf("%.30s = %d\n", "standbyCurrent_mA", u.state.standbyCurrent_mA); cprintf("%.30s = %u\n", "standbyTimeToEmpty_min", u.state.standbyTimeToEmpty_min); cprintf("%.30s = %u\n", "stateOfHealth_ppcpx", u.state.stateOfHealth_ppcpx); cprintf("%.30s = %u\n", "cycleCount", u.state.cycleCount); cprintf("%.30s = %u\n", "stateOfCharge_ppc", u.state.stateOfCharge_ppc); cprintf("%.30s = %d\n", "instantaneousCurrent_mA", u.state.instantaneousCurrent_mA); cprintf("%.30s = %u\n", "internalTemperature_dK", u.state.internalTemperature_dK); cprintf("%.30s = %u\n", "reistanceScale", u.state.reistanceScale); cprintf("%.30s = %u\n", "operationConfiguration", u.state.operationConfiguration); cprintf("%.30s = %u\n", "designCapacity_mAh", u.state.designCapacity_mAh); cprintf("flags %02x ; ENn state %d\n", flags, (bq24210.en_port->out & bq24210.en_bit)); flags &= ~FLG_DUMP_STATE; } if (FLG_TOGGLE_ENABLE & flags) { bq24210.en_port->out ^= bq24210.en_bit; flags &= ~FLG_TOGGLE_ENABLE; } vBSP430ledSet(BSP430_LED_GREEN, !(bq24210.en_port->out & bq24210.en_bit)); rc = readBQ27510(i2c, 0, nwords, u.raw); temperature_dC = u.state.temperature_dK - 2733; cprintf("%s: %c%c%c % 2d.%dC %4dmV ; SoC %u%% ; Cap %4d / %4d ; %dmA ~ %dmA / %u\n", xBSP430uptimeAsText(ulBSP430uptime(), astext_buf), (bq24210.en_port->out & bq24210.en_bit) ? ' ' : 'E', (bq24210.chg_port->in & bq24210.chg_bit) ? ' ' : 'C', (bq24210.pg_port->in & bq24210.pg_bit) ? ' ' : 'P', (temperature_dC / 10), (temperature_dC % 10), u.state.voltage_mV, u.state.stateOfCharge_ppc, u.state.remainingCapacity_mAh, u.state.fullAvailableCapacity_mAh, u.state.instantaneousCurrent_mA, u.state.averageCurrent_mA, u.state.cycleCount ); if (FLG_UPDATE_INTERVAL & flags) { resample_wake_utt += resample_interval_utt; flags &= ~FLG_UPDATE_INTERVAL; } flags = 0; while (! flags) { iBSP430consoleFlush(); if (0 >= lBSP430uptimeSleepUntil(resample_wake_utt, LPM3_bits)) { flags |= FLG_UPDATE_INTERVAL; } while (0 <= ((rc = cgetchar()))) { if ('!' == rc) { flags |= FLG_TOGGLE_ENABLE; } else if (' ' == rc) { flags |= FLG_DUMP_STATE; } } } } }
void main () { hBSP430halSERIAL i2c = hBSP430serialLookup(APP_TMP102_I2C_PERIPH_HANDLE); uint8_t pr = 0; vBSP430platformInitialize_ni(); (void)iBSP430consoleInitialize(); cprintf("I2C interface on %s is %p\n", xBSP430serialName(APP_TMP102_I2C_PERIPH_HANDLE), i2c); #if BSP430_PLATFORM_PERIPHERAL_HELP cprintf("TMP102 I2C Pins: %s\n", xBSP430platformPeripheralHelp(APP_TMP102_I2C_PERIPH_HANDLE, BSP430_PERIPHCFG_SERIAL_I2C)); #endif /* BSP430_PLATFORM_PERIPHERAL_HELP */ i2c = hBSP430serialOpenI2C(i2c, BSP430_SERIAL_ADJUST_CTL0_INITIALIZER(UCMST), 0, 0); if (! i2c) { cprintf("I2C open failed.\n"); return; } (void)iBSP430i2cSetAddresses_ni(i2c, -1, APP_TMP102_I2C_ADDRESS); /** Raw number is a 16 bit value. First 12 bits represent the * temperature as a count of 0.0625C values. (If the LSB is 1, then * an extended temperature is used and the 13th bit represents a * half count.) 0.625 = 5/8; shifting by 3 gets us the 13-bit * value; dividing by 2 accounts for the half-count in extended * temperature mode. */ #define TMP102_RAW_TO_dC_(raw_) (5 * ((raw_) >> 3) / 16) #define TMP102_RAW_TO_dC(raw_) ((0 <= (int)(raw_)) ? TMP102_RAW_TO_dC_(raw_) : -TMP102_RAW_TO_dC_(-(int)(raw_))) #define dC_TO_dF(dC_) (320 + 9 * (dC_) / 5) #if 0 { unsigned int data[] = { 0x7FF0, 0x4B00, 0x1900, 0xFFC0, 0xE700, 0xC908 }; int i; for (i = 0; i < sizeof(data)/sizeof(*data); ++i) { int temp_dC = TMP102_RAW_TO_dC(data[i]); cprintf("temp 0x%04x = %d dC = %d d[degF]\n", data[i], temp_dC, dC_TO_dF(temp_dC)); } } #endif while (1) { int rc; uint8_t data[2]; uint16_t raw; rc = iBSP430i2cTxData_ni(i2c, &pr, 1); if (0 > rc) { cprintf("I2C TX ERROR\n"); break; } memset(data, 0, sizeof(data)); rc = iBSP430i2cRxData_ni(i2c, data, sizeof(data)); if (0 > rc) { cprintf("I2C RX ERROR\n"); break; } raw = data[1] | (data[0] << 8); if (0 == pr) { int temp_dC = TMP102_RAW_TO_dC(raw); cprintf("temp 0x%04x = %d dC = %d d[degF]\n", raw, temp_dC, dC_TO_dF(temp_dC)); } else { cprintf("reg %d is 0x%04x\n", pr, raw); } pr = (pr + 1) & 0x03; BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ); } }
void main () { int rc = 0; /* GDO0 and GDO2 are always interrupt-capable. */ volatile sBSP430hplPORTIE * gdo0 = xBSP430hplLookupPORTIE(BSP430_RF_CC110X_GDO0_PORT_PERIPH_HANDLE); volatile sBSP430hplPORTIE * gdo2 = xBSP430hplLookupPORTIE(BSP430_RF_CC110X_GDO2_PORT_PERIPH_HANDLE); hBSP430halPORT hgdo1 = hBSP430portLookup(BSP430_RF_CC110X_GDO1_PORT_PERIPH_HANDLE); hBSP430halPORT hcsn = hBSP430portLookup(BSP430_RF_CC110X_CSn_PORT_PERIPH_HANDLE); spi = hBSP430serialLookup(BSP430_RF_CC110X_SPI_PERIPH_HANDLE); vBSP430platformInitialize_ni(); (void)iBSP430consoleInitialize(); cprintf("\nccid " __DATE__ " " __TIME__ "\n"); cprintf("GDO0 %p at %s.%u\n", gdo0, xBSP430portName(BSP430_RF_CC110X_GDO0_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_RF_CC110X_GDO0_PORT_BIT)); cprintf("GDO1 HAL %p HPL %p at %s.%u\n", hgdo1, hgdo1->hpl.any, xBSP430portName(BSP430_RF_CC110X_GDO1_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_RF_CC110X_GDO1_PORT_BIT)); cprintf("GDO2 %p at %s.%u\n", gdo2, xBSP430portName(BSP430_RF_CC110X_GDO2_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_RF_CC110X_GDO2_PORT_BIT)); cprintf("CSn HAL %p HPL %p at %s.%u\n", hcsn, hcsn->hpl.any, xBSP430portName(BSP430_RF_CC110X_CSn_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_RF_CC110X_CSn_PORT_BIT)); cprintf("SPI %p is %s\n", spi, xBSP430serialName(BSP430_RF_CC110X_SPI_PERIPH_HANDLE)); #if BSP430_PLATFORM_PERIPHERAL_HELP cprintf("SPI Pins: %s\n", xBSP430platformPeripheralHelp(BSP430_RF_CC110X_SPI_PERIPH_HANDLE, BSP430_PERIPHCFG_SERIAL_SPI3)); #endif /* BSP430_PLATFORM_PERIPHERAL_HELP */ cprintf(__DATE__ " " __TIME__ "\n"); /* Configure the SPI interface, but immediately put it into hold * mode so we can check CHIP_RDYn on the MISO/GDO1 input. */ spi = hBSP430serialOpenSPI(spi, BSP430_RF_CC110X_SPI_CTL0_BYTE, 0, 0); if (spi) { rc = iBSP430serialSetHold_rh(spi, 1); /* GDO1 to input, pull-up */ BSP430_PORT_HAL_HPL_DIR(hgdo1) &= ~BSP430_RF_CC110X_GDO1_PORT_BIT; BSP430_PORT_HAL_SET_REN(hgdo1, BSP430_RF_CC110X_GDO1_PORT_BIT, BSP430_PORT_REN_PULL_UP); } cprintf("SPI device %p hold returned %d\n", spi, rc); if (! spi) { return; } /* Configure CSn initial high to ensure we have a falling edge when * we first enable the radio. */ BSP430_PORT_HAL_HPL_SEL(hcsn) &= ~BSP430_RF_CC110X_CSn_PORT_BIT; BSP430_PORT_HAL_HPL_OUT(hcsn) |= BSP430_RF_CC110X_CSn_PORT_BIT; BSP430_PORT_HAL_HPL_DIR(hcsn) |= BSP430_RF_CC110X_CSn_PORT_BIT; /* Now enable the radio */ BSP430_PORT_HAL_HPL_OUT(hcsn) &= ~BSP430_RF_CC110X_CSn_PORT_BIT; /* Spin until GDO1 (CHP_RDYn) is clear indicating radio is responsive */ while (BSP430_PORT_HAL_HPL_IN(hgdo1) & BSP430_RF_CC110X_GDO1_PORT_BIT) { cprintf("Waiting for radio ready\n"); BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ); } /* Enable SPI */ rc = iBSP430serialSetHold_rh(spi, 0); cprintf("Radio is up, hold release %d; sending SRES strobe\n", rc); /* Send a reset */ do { rc = sendStrobe(0x30); cprintf("Strobe response %#02x\n", rc); if (0x0F != rc) { BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ); } } while (0x0F != rc); cprintf("PARTNUM response %#02x\n", readRegister(0x30)); cprintf("VERSION response %#02x\n", readRegister(0x31)); cprintf("IOCFG2 read %#02x\n", readRegister(0x00)); cprintf("IOCFG1 read %#02x\n", readRegister(0x01)); cprintf("IOCFG0 read %#02x\n", readRegister(0x02)); /* ChipCon radios consume 1.4mA when idle. That goes down to * nominally 400 nA if the GDOs are configured to "HW to 0" and the * chip is told to power-down on loss of CSn. On the EXP430F5438 * the RF PWR header indicates that a CC1101 is using 40 nA in this * mode.*/ rc = writeRegister(0x00, 0x2f); rc = writeRegister(0x01, 0x2f); rc = writeRegister(0x02, 0x2f); cprintf("Cleared IOCFG\n"); cprintf("IOCFG2 read %#02x\n", readRegister(0x00)); cprintf("IOCFG1 read %#02x\n", readRegister(0x01)); cprintf("IOCFG0 read %#02x\n", readRegister(0x02)); /* SPWD */ rc = sendStrobe(0x39); cprintf("SPWD got %d\n", rc); /* Disable SPI before removing CSn otherwise the sequence isn't * right. */ rc = iBSP430serialSetHold_rh(spi, 1); BSP430_PORT_HAL_HPL_OUT(hcsn) |= BSP430_RF_CC110X_CSn_PORT_BIT; /* This gets the RF2500T power down to about 120 nA. Note: * Purposefully enter LPM with #GIE off since we do not intend to * wake up.*/ BSP430_CORE_LPM_ENTER(LPM3_bits); }
void main () { int rc; sBSP430m25p m25p_data; hBSP430m25p m25p; unsigned long addr; unsigned long t0; unsigned long t1; vBSP430platformInitialize_ni(); (void)iBSP430consoleInitialize(); cprintf("\nBuild " __DATE__ " " __TIME__ "\n"); cprintf("SPI is %s: %s\n", xBSP430serialName(BSP430_PLATFORM_M25P_SPI_PERIPH_HANDLE), xBSP430platformPeripheralHelp(BSP430_PLATFORM_M25P_SPI_PERIPH_HANDLE, 0)); #ifdef BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE cprintf("PWR at %s.%u\n", xBSP430portName(BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_PLATFORM_M25P_PWR_PORT_BIT)); #else /* BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE */ cprintf("PWR is hard-wired\n"); #endif /* BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE */ #ifdef BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE cprintf("RSTn at %s.%u\n", xBSP430portName(BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_PLATFORM_M25P_RSTn_PORT_BIT)); #else /* BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE */ cprintf("RSTn is hard-wired\n"); #endif /* BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE */ cprintf("CSn at %s.%u\n", xBSP430portName(BSP430_PLATFORM_M25P_CSn_PORT_PERIPH_HANDLE), iBSP430portBitPosition(BSP430_PLATFORM_M25P_CSn_PORT_BIT)); memset(&m25p_data, 0, sizeof(m25p_data)); m25p_data.spi = hBSP430serialLookup(BSP430_PLATFORM_M25P_SPI_PERIPH_HANDLE); m25p_data.csn_port = xBSP430hplLookupPORT(BSP430_PLATFORM_M25P_CSn_PORT_PERIPH_HANDLE); m25p_data.csn_bit = BSP430_PLATFORM_M25P_CSn_PORT_BIT; #ifdef BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE m25p_data.rstn_port = xBSP430hplLookupPORT(BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE); m25p_data.rstn_bit = BSP430_PLATFORM_M25P_RSTn_PORT_BIT; #endif /* BSP430_PLATFORM_M25P_RSTn_PORT_PERIPH_HANDLE */ m25p = hBSP430m25pInitialize(&m25p_data, BSP430_SERIAL_ADJUST_CTL0_INITIALIZER(UCCKPL | UCMSB | UCMST), UCSSEL_2, 1); if (NULL == m25p) { cprintf("M25P device initialization failed.\n"); return; } #ifdef BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE { volatile sBSP430hplPORT * pwr_hpl; /* Turn on power, then wait 10 ms for chip to stabilize before releasing RSTn. */ pwr_hpl = xBSP430hplLookupPORT(BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE); pwr_hpl->out &= ~BSP430_PLATFORM_M25P_PWR_PORT_BIT; pwr_hpl->dir |= BSP430_PLATFORM_M25P_PWR_PORT_BIT; pwr_hpl->out |= BSP430_PLATFORM_M25P_PWR_PORT_BIT; BSP430_CORE_DELAY_CYCLES(10 * (BSP430_CLOCK_NOMINAL_MCLK_HZ / 1000)); } #endif /* BSP430_PLATFORM_M25P_PWR_PORT_PERIPH_HANDLE */ BSP430_M25P_RESET_CLEAR(m25p); cprintf("Status register %d\n", iBSP430m25pStatus_ni(m25p)); rc = iBSP430m25pStrobeCommand_ni(m25p, BSP430_M25P_CMD_WREN); cprintf("WREN got %d, status register %d\n", rc, iBSP430m25pStatus_ni(m25p)); rc = iBSP430m25pStrobeCommand_ni(m25p, BSP430_M25P_CMD_WRDI); cprintf("WRDI got %d, status register %d\n", rc, iBSP430m25pStatus_ni(m25p)); rc = iBSP430m25pInitiateCommand_ni(m25p, BSP430_M25P_CMD_RDID); if (0 == rc) { rc = iBSP430m25pCompleteTxRx_ni(m25p, NULL, 0, 20, buffer); } BSP430_CORE_ENABLE_INTERRUPT(); cprintf("READ_IDENTIFICATION got %d\n", rc); if (0 <= rc) { dumpMemory(buffer, rc, 0); } cprintf("Config identified %u sectors of %lu bytes each: %lu bytes total\n", BSP430_PLATFORM_M25P_SECTOR_COUNT, (unsigned long)BSP430_PLATFORM_M25P_SECTOR_SIZE, BSP430_PLATFORM_M25P_SECTOR_COUNT * (unsigned long)BSP430_PLATFORM_M25P_SECTOR_SIZE); #if (BSP430_PLATFORM_M25P_SUBSECTOR_SIZE - 0) cprintf("Config supports access as %u sub-sectors of %u bytes each\n", (unsigned int)(BSP430_PLATFORM_M25P_SECTOR_COUNT * (BSP430_PLATFORM_M25P_SECTOR_SIZE / BSP430_PLATFORM_M25P_SUBSECTOR_SIZE)), (unsigned int)BSP430_PLATFORM_M25P_SUBSECTOR_SIZE); #else /* BSP430_PLATFORM_M25P_SUBSECTOR_SIZE */ cprintf("Config indicates device is not sub-sector addressable\n"); #endif /* BSP430_PLATFORM_M25P_SUBSECTOR_SIZE */ cprintf("RDID identified %lu bytes total capacity\n", 0x1UL << buffer[2]); addr = 0; rc = readFromAddress(m25p, addr, sizeof(flashContents)); if (sizeof(flashContents) != rc) { cprintf("ERROR %d reading initial block\n", rc); } else { dumpMemory(buffer, rc, addr); if (0 == memcmp(flashContents, buffer, rc)) { cprintf("Found expected contents.\n"); } } #if (BSP430_PLATFORM_M25P_SUPPORTS_PE - 0) rc = writeToAddress(m25p, BSP430_M25P_CMD_PE, addr, NULL, 0); cprintf("PAGE_ERASE got %d\n", rc); #else /* BSP430_PLATFORM_M25P_SUPPORTS_PE */ rc = writeToAddress(m25p, BSP430_M25P_CMD_SE, addr, NULL, 0); cprintf("SECTOR_ERASE got %d\n", rc); #endif /* BSP430_PLATFORM_M25P_SUPPORTS_PE */ rc = readFromAddress(m25p, addr, sizeof(buffer)); if (0 < rc) { dumpMemory(buffer, rc, addr); } rc = writeToAddress(m25p, BSP430_M25P_CMD_PP, addr, flashContents, sizeof(flashContents)); cprintf("PAGE_PROGRAM got %d\n", rc); rc = readFromAddress(m25p, addr, sizeof(buffer)); if (0 < rc) { dumpMemory(buffer, rc, addr); } /* PAGE PROGRAM is the one that only clears 1s to 0s so needs a * prior page or sector erase */ rc = writeToAddress(m25p, BSP430_M25P_CMD_PP, addr, flashContents + 4, 4); cprintf("PAGE_PROGRAM to %lx returned %d\n", addr, rc); rc = readFromAddress(m25p, 0, sizeof(flashContents)); dumpMemory(buffer, rc, 0); /* Write 4 took 8 PAGE_PROGRAM to 0 returned 4 00000000 88 11 03 30 cc 33 c3 3c 01 23 45 67 89 ab cd ef ...0.3.<.#Eg.... */ /* PAGE_WRITE is the one that does not need a prior erase cycle */ addr = 8; #if (BSP430_PLATFORM_M25P_SUPPORTS_PW - 0) rc = writeToAddress(m25p, BSP430_M25P_CMD_PW, addr, flashContents + 4, 4); cprintf("PAGE_WRITE to %lx returned %d\n", addr, rc); #else rc = writeToAddress(m25p, BSP430_M25P_CMD_PP, addr, flashContents + 4, 4); cprintf("overwrite PAGE_PROGRAM to unerased %lx returned %d\n", addr, rc); #endif rc = readFromAddress(m25p, 0, sizeof(flashContents)); dumpMemory(buffer, rc, 0); /* Write 4 took 204 PAGE_WRITE to 8 returned 4 00000000 88 11 03 30 cc 33 c3 3c cc 33 c3 3c 89 ab cd ef ...0.3.<.3.<.... */ cprintf("Initiating bulk erase..."); BSP430_CORE_DISABLE_INTERRUPT(); do { t0 = t1 = 0; rc = iBSP430m25pStrobeCommand_ni(m25p, BSP430_M25P_CMD_WREN); if (0 == rc) { rc = iBSP430m25pStrobeCommand_ni(m25p, BSP430_M25P_CMD_BE); } if (0 == rc) { int sr; t0 = ulBSP430uptime_ni(); do { sr = iBSP430m25pStatus_ni(m25p); } while ((0 <= sr) && (BSP430_M25P_SR_WIP & sr)); t1 = ulBSP430uptime(); } } while (0); BSP430_CORE_ENABLE_INTERRUPT(); cprintf("\nBULK_ERASE got %d\n", rc); if (0 == rc) { char tstr[BSP430_UPTIME_AS_TEXT_LENGTH]; cprintf("Bulk erase took %lu utt = %s\n", t1-t0, xBSP430uptimeAsText(t1 - t0, tstr)); } rc = readFromAddress(m25p, 0, sizeof(flashContents)); dumpMemory(buffer, rc, 0); rc = writeToAddress(m25p, BSP430_M25P_CMD_PP, 0, flashContents, sizeof(flashContents)); cprintf("Restore got %d\n", rc); addr = 0; while (addr < (256 * 1025L)) { rc = readFromAddress(m25p, addr, sizeof(buffer)); if (0 > rc) { break; } dumpMemory(buffer, rc, addr); addr += rc; break; } }