Statistics: Posted by mculibrk — Thu Dec 29, 2016 3:39 pm
Statistics: Posted by roc2 — Thu Dec 15, 2016 7:30 pm
Statistics: Posted by uwwint — Sun Jul 12, 2015 4:07 pm
Statistics: Posted by netlook — Wed Apr 29, 2015 6:33 pm
Code:
data definitions
uint32 dataBuffer[2047]; 8KB work buffer
uint32 dataIndex;
//pseudo code for HSPI interrupt handler
HSPI_int_handler() {
if (dataIndex < 2032) {
// copy 16 (or more?) dwords from RAM buffer to HSPI FIFO (W0..15, ..31?)
for (i=0;i<16;i++)
SPI_W(i) = dataBuffer[dataIndex + i]
// restart HSPI
SET_PERI_REG_MASK(SPI_CMD, SPI_USR)
}
}
Code:
configure HSPI INT handler (possibly high-level int)
enable HSPI ints
Statistics: Posted by mculibrk — Wed Apr 29, 2015 4:29 pm
Code:
1.Update the spi_register.h,add another control registers
#define SPI_CTRL1(i) (REG_SPI_BASE(i) + 0xc)
#define SPI_CS_HOLD_DELAY 0xf
#define SPI_CS_HOLD_DELAY_S 28
#define SPI_CS_HOLD_DELAY_RES 0xfff
#define SPI_CS_HOLD_DELAY_RES_S 16
2.Reduce the delay on CS line: set SPI_CS_HOLD_DELAY in SPI_CTRL1 to 0
SET_PERI_REG_BITS(SPI_CTRL1(HSPI), SPI_CS_HOLD_DELAY, 0, SPI_CS_HOLD_DELAY_S); //test spi cs config
3.Some suggestions for SPI_MOSI_DELAY_MODE setting:
#define SPI_MOSI_DELAY_MODE 0x00000003
//mode 0 : posedge; data set at positive edge of clk
//mode 1 : negedge + 1 cycle delay, only if freq<10MHz ; data set at negitive edge of clk
//mode 2 : Do not use this mode.
#define SPI_MOSI_DELAY_NUM 0x00000007
//mode == 0 and freq<=40Mhz ,can be set to 0 or 1 ;
//freq==80MHz :0 ,must set to 0;
Statistics: Posted by netlook — Wed Apr 29, 2015 3:41 pm
Statistics: Posted by mculibrk — Sun Apr 26, 2015 11:36 pm
Code:
//SET_PERI_REG_MASK(SPI_USER(ESP_SPI_HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_MOSI| /* only data part */
SET_PERI_REG_MASK(SPI_USER(ESP_SPI_HSPI), SPI_USR_MOSI| /* only data part */
WRITE_PERI_REG(SPI_CTRL2(ESP_SPI_HSPI), 1<<SPI_MOSI_DELAY_MODE_S); // mosi has 1/2 spi_clk delay -> data out change/valid on clock fall
2.Do you try to change the SPI clock frequency to check whether the interval is 7uS ?
Would you send the bin file for our further study?
Statistics: Posted by mculibrk — Mon Apr 20, 2015 4:24 pm
Statistics: Posted by netlook — Mon Apr 20, 2015 2:04 pm
Code:
// worker
void wspi_spi_engine(volatile isrState_t *S) {
uint32 *dst;
uint32 tmr;
register uint32 idx;
// if anything is waiting in the fifo shadow load it and re-trigger transfer & interrupt
if (S->spiFIFObits) {
dst = (uint32 *)SPI_W0(ESP_SPI_HSPI);
src = (uint32 *)&S->spiFIFO[0];
for (idx = 0; idx < 16; idx++)
dst[idx] = S->spiFIFO[idx];
CLEAR_PERI_REG_MASK(SPI_USER1(ESP_SPI_HSPI), SPI_USR_MOSI_BITLEN << SPI_USR_MOSI_BITLEN_S);
SET_PERI_REG_MASK(SPI_USER1(ESP_SPI_HSPI), S->spiFIFObits << SPI_USR_MOSI_BITLEN_S);
SET_PERI_REG_MASK(SPI_CMD(ESP_SPI_HSPI), SPI_USR); // start new transfer
}
// some other stuff here, taking approx 1 uS
}
// ISR handler registered via ETS_SPI_INTR_ATTACH()
void esp_spi_isr_handler(void *ptr) {
uint32 tmr;
volatile isrState_t *S;
S = (isrState_t *)ptr;
PROFILE(tmr = get_ccount());
if (READ_PERI_REG(PERI_INT_FLAGS) & PERI_INTF_HSPI) {
CLEAR_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_HSPI), (SLV_SPI_INT_EN<<SLV_SPI_INT_EN_S)|SLV_SPI_INT_EN); // clear all en & events
wspi_spi_engine(S);
SET_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_HSPI), SLV_SPI_INT_EN<<SLV_SPI_INT_EN_S); // enable all?
S->dbg.intSPI++;
// record no of inst for chunk load
PROFILE(S->dbg.tmrLoad = get_ccount() - tmr);
}
if (READ_PERI_REG(PERI_INT_FLAGS) & PERI_INTF_SPI) {
CLEAR_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_SPI), (SLV_SPI_INT_EN<<SLV_SPI_INT_EN_S)|SLV_SPI_INT_EN); // 0x3FF
}
}
// SPI config
CLEAR_PERI_REG_MASK(SPI_USER(ESP_SPI_HSPI), SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY|SPI_USR_MISO|SPI_USR_MOSI_HIGHPART|SPI_USR_MISO_HIGHPART|
SPI_SIO|SPI_FWRITE_DIO|SPI_FWRITE_QIO|SPI_FWRITE_DUAL|SPI_FWRITE_QUAD|SPI_WR_BYTE_ORDER|SPI_RD_BYTE_ORDER|SPI_CK_I_EDGE|SPI_CK_OUT_EDGE|SPI_FLASH_MODE);
SET_PERI_REG_MASK(SPI_USER(ESP_SPI_HSPI), SPI_USR_MOSI| /* only data part */
SPI_WR_BYTE_ORDER |SPI_CK_OUT_EDGE); // little endian out, rising clock edge
CLEAR_PERI_REG_MASK(SPI_CTRL(ESP_SPI_HSPI), SPI_WR_BIT_ORDER|SPI_RD_BIT_ORDER| /* MSB bit order for I/O */
SPI_QIO_MODE|SPI_DIO_MODE|SPI_QOUT_MODE|SPI_DOUT_MODE|SPI_FASTRD_MODE); // disable multi bit IN options
WRITE_PERI_REG(SPI_CTRL2(ESP_SPI_HSPI), 1<<SPI_MOSI_DELAY_MODE_S); // 1/2 spi_clk delay
SET_PERI_REG_MASK(SPI_PIN(ESP_SPI_HSPI), SPI_CS0_DIS|SPI_CS1_DIS|SPI_CS2_DIS); // no CS needed
CLEAR_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_HSPI), SPI_SLAVE_MODE| /* enable master mode */
(SLV_SPI_INT_EN<<SLV_SPI_INT_EN_S)| /* disable interrupts */
SPI_SLV_CMD_DEFINE|SPI_TRANS_DONE|SPI_SLV_WR_STA_DONE|SPI_SLV_RD_STA_DONE|SPI_SLV_WR_BUF_DONE|SPI_SLV_RD_BUF_DONE); // clear flags
SET_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_HSPI), SPI_SYNC_RESET); // reset SPI module?
WRITE_PERI_REG(SPI_CLOCK(ESP_SPI_HSPI), (0<<SPI_CLKDIV_PRE_S) | (24<<SPI_CLKCNT_N_S) | (12<<SPI_CLKCNT_H_S) | (0<<SPI_CLKCNT_L_S));
ETS_INTR_DISABLE(ETS_SPI_INUM);
ETS_SPI_INTR_ATTACH(esp_spi_isr_handler, (void *)&SPIstate);
//enable level2 isr, which contains spi, hspi and i2s events
ETS_INTR_ENABLE(ETS_SPI_INUM);
SET_PERI_REG_MASK(SPI_SLAVE(ESP_SPI_HSPI), SPI_TRANS_DONE_EN|SPI_SLV_WR_BUF_DONE_EN);
Statistics: Posted by mculibrk — Thu Apr 16, 2015 4:08 pm
Statistics: Posted by mculibrk — Tue Apr 14, 2015 11:02 pm