• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 не проверял.
 
Сверху Снизу