HSPI и GPIO15

clinkme

New member
Собрался подключить к ESP-12 LCD дисплей по SPI-интерфейсу.
По документации, аппаратный CS привязан к GPIO15 (PERIPHS_IO_MUX_MTDO_U).
Однако, для того чтобы модуль нормально загружался,
GPIO15 при загрузке должен притянут к GND (я раньше всегда ставил резистор 10К на землю).
Но как в этом случае использовать аппаратный CS?
 

pvvx

Активный участник сообщества
У обоих SPI модулей в ESP8266 вроде минимум 3 CS (счас не помню точно, но их явно больше):
CS0 GPIO0
CS1 GPIO1
CS2 GPIO11
Какой из них будет работать выбирается в регистрах SPI.
Возможно поможет разобраться пример в SDK \ESP8266_SDK\examples\driver_lib\driver\spi_overlap.c
Код:
#define SPI_PIN(i)                            (REG_SPI_BASE(i)  + 0x2C)
#define SPI_CS2_DIS (BIT(2))
#define SPI_CS1_DIS (BIT(1))
#define SPI_CS0_DIS (BIT(0))
 
Последнее редактирование:

pvvx

Активный участник сообщества
Если не хотите мучаться и есть лишний инвертор, то ставите инверсию сигнала SPI_PIN_CS_INV:
Код:
#define SPI_PIN(i)                    (REG_SPI_BASE(i) + 0x2C) // default = 0000001e/0000001e
#define SPI_PIN_CLK_INV (BIT(29))     // инверсия сигнала CLK
#define SPI_PIN_MOSI_MISO (BIT(16)) // сигнал MISO выводится на MOSI
#define SPI_PIN_CS_INV (BIT(6))     // инверсия сигнала CS
#define SPI_CS2_DIS                        (BIT(2))
#define SPI_CS1_DIS                        (BIT(1))
#define SPI_CS0_DIS                        (BIT(0))
Для решения вашей задачи можно манипулировать переключением всех входов/выходов SPI0 на SPI1 и SP1 на SP0 (полный swap):
PERI_IO_SWAP: 0x3FF00028
bit0: swap two uart
bit1: swap two spi
bit2: swap uart0 pins (u0rxd <-> u0cts), (u0txd <-> u0rts)
bit3: swap uart1 pins (u1rxd <-> u1cts), (u1txd <-> u1rts)
bit5: hspi is with the higher prior
bit6: two spi masters on hspi
bit7: two spi masters on cspi (reg_cspi_overlap)
Короче методов много - выбирайте сами.
 
Последнее редактирование:
Сверху Снизу