Re: ULP RISCV SPI Simulation Using Bit-banging
Posted: Sun Feb 02, 2025 10:34 am
I encountered another major problem. Assigning a single byte to an array element takes about 7 µs! Is there a more optimal way to store a 27-byte block faster?
Code: Select all
uint8_t read_buffer[27] = {0};
for(int i = 0; i < 27; i++) {
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) / 4);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) / 2);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)));
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) * 2);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) * 4);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) * 8);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) * 16);
REG_WRITE(RTC_GPIO_OUT_W1TS_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TS_S)); REG_WRITE(RTC_GPIO_OUT_W1TC_REG, (BIT(CLK_PIN) << RTC_GPIO_OUT_DATA_W1TC_S));
byte1 |= (uint8_t)(((REG_READ(RTC_GPIO_IN_REG) >> RTC_GPIO_IN_NEXT_S) & BIT(DATA_PIN)) * 32);
read_buffer[i] = byte1;
}