Во-первых оно на самом деле работает.
В hal предусмотрена возможность выбирать одно из семи устройств (в RTL-00 доступны только три вывода: PC_0, 4, 5).
Трех мне мало поэтому решил проверить нельзя ли поиметь больше CS например если выдавать не бит а код и использовать дешифратор.
Оказалось можно!
Номер слэйва записывается в регистр REG_DW_SSI_SER и туда можно писать любой код и он будет выдан на выводы CS_0 - CS_7. Ставим дешифратор и получаем на трех CS доступных в RTL-00 до шести аппаратно выбираемых слэйвов (шесть потому что код 0 запрещен).
Multi cs есть только на SPI0.
Порт E не проверял.
В hal предусмотрена возможность выбирать одно из семи устройств (в RTL-00 доступны только три вывода: PC_0, 4, 5).
Трех мне мало поэтому решил проверить нельзя ли поиметь больше CS например если выдавать не бит а код и использовать дешифратор.
Оказалось можно!
Номер слэйва записывается в регистр REG_DW_SSI_SER и туда можно писать любой код и он будет выдан на выводы CS_0 - CS_7. Ставим дешифратор и получаем на трех CS доступных в RTL-00 до шести аппаратно выбираемых слэйвов (шесть потому что код 0 запрещен).
Код:
// инициализация
spi_init(&spi_master, SPI0_MOSI, SPI0_MISO, SPI0_SCLK, SPI0_CS); // CS заданный тут нигде не используется
spi_format(&spi_master, 16, 0, 0);
spi_frequency(&spi_master, 200000);
spi_slave_select(&spi_master, 3); // нужен только чтобы включить SPI0_MULTI_CS_EN в регистре SPI_MUX_CTRL, число любое от 2 до 7
// код CS_x
// допустимый диапазон cs_code 1...0xff, если 0 - SPI зависает
*(volatile uint32_t*)(SSI0_REG_BASE + REG_DW_SSI_SER) = cs_code; // перед обменом задаем код слэйва (лучше использовать HAL_SSI_WRITE32())
ReadData = spi_master_write(&spi_master, TestData);
Multi cs есть только на SPI0.
Порт E не проверял.