Hi,
I've began making a SPI module for programming a PIC16. It only transmits data, so two pins.
My questions are:
1. any obvious errors?
2. does the EVENTS_ENDTX occur when the double buffer is empty? I need to ensure the cpu is a step ahead of the buffer emptying to ensure data continuity. The 'ENDTX' suggests I could be in a race to fill the buffer again before the SPI has it's next clock. If so, best means to approach it?
inline void GLUE_Start (void) {
NRF_SPIM0->ENABLE = 1;
}
static void wait (void) {
while (! NRF_SPIM0->EVENTS_ENDTX) {}
NRF_SPIM0->EVENTS_ENDTX = 0;
}
static void bulkErase (void) {
NRF_SPI0->TXD = 0x18; // bulk erase
nrf_delay_ms(10); // TERAB
}
static void loadAddress (uint24_t value) {
NRF_SPI0->TXD = 0x80;
wait();
NRF_SPI0->TXD = value >> 15
wait();
NRF_SPI0->TXD = value >> 7 & 255;
wait();
NRF_SPI0->TXD = value & 255;
}
inline void GLUE_UpdateFirmware(void) {
NRF_GPIO->OUTSET = 1 << CFG_PIN_GLUE_MODE; // into reset
NRF_GPIO->OUTSET = 1 << CFG_PIN_GLUE_VBUSPOW; // enable 3.3v power
GLUE_Start();
NRF_SPI0->TXD = 'M';
NRF_SPI0->TXD = 'C';
wait();
NRF_SPI0->TXD = 'H';
wait();
NRF_SPI0->TXD = 'P';
wait();
NRF_SPI0->TXD = 'P';
wait();
loadAddress(0x8000); // all areas
bulkErase();
GLUE_ShutDown();
NRF_GPIO->OUTCLR = 1 << CFG_PIN_GLUE_MODE; // out of reset
NRF_GPIO->OUTCLR = 1 << CFG_PIN_GLUE_VBUSPOW; // enable 5v power
}