• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

SPI0 MULTI CS

sharikov

Active member
Во-первых оно на самом деле работает.
В 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 не проверял.
 
Сверху Снизу