Я эти костыли применил после того, как намучался с вариантом "ПРАВИЛЬНО", который вот ну не работал и все тут

а вот это не правдаdtvims писал(а):Вы меня кажется не поняли!
Я эти костыли применил после того, как намучался с вариантом "ПРАВИЛЬНО", который вот ну не работал и все тут
То вы проверку TXE пройдете сразу !!! так как после записи в SPI_DR байт сразу уйдет в сдвиговый !!!- Установка DC=0;
- отправка в DR=код команды
- Здесь проверка флага TXE
то будет ошибка !!! потому что дисплей еще не получил код команды (реально по MOSI пройдет максимум пара бит) - а вы меняете состояние линии DC !!!- Установка DC=1
- отправка в DR=данные команды
- Здесь проверка флага TXE
а передача данных после нее так:- Установка DC=0;
- Здесь проверка флага TXE
- отправка в DR=код команды
И не нужно никаких задержек ! вне зависимости от скорости SPI от минимума до максимума все будет работать !!- Здесь проверка флага BSY
- Установка DC=1
- Здесь проверка флага TXE
- отправка в DR=данные команды
Код: Выделить всё
// передача данных на дисплей
void SPI2_SendByte(uint8_t sendData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, sendData);
}
// отправка команды на дисплей
void ili9341c_CMD(uint8_t sendData)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // DC=0;
SPI2_SendByte(sendData);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
}
// отправка данных на дисплей
void ili9341c_DATA(uint8_t sendData)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12); // DC=1;
SPI2_SendByte(sendData);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
}
// определение области для вывода
void ili9341c_SetWindow(uint16_t ystart, uint16_t xstart, uint16_t yend, uint16_t xend)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // DC=0;
SPI2_SendByte(LCD_PAGE_ADDR);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
GPIO_SetBits(GPIOB, GPIO_Pin_12); // DC=1;
SPI2_SendByte(xstart>>8);
SPI2_SendByte(xstart&0xFF);
SPI2_SendByte(xend>>8);
SPI2_SendByte(xend&0xFF);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // DC=0;
SPI2_SendByte(LCD_COLUMN_ADDR);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
GPIO_SetBits(GPIOB, GPIO_Pin_12); // DC=1;
SPI2_SendByte(ystart>>8);
SPI2_SendByte(ystart&0xFF);
SPI2_SendByte(yend>>8);
SPI2_SendByte(yend&0xFF);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
}
// заполнение цветом прямоугольной области экрана
void ili9341c_FillRect(uint16_t ystart, uint16_t xstart, uint16_t ystop, uint16_t xstop, uint16_t color)
{
uint32_t n;
GPIO_ResetBits(GPIOB, GPIO_Pin_11); // CS=0;
ili9341c_SetWindow(ystart, xstart, ystop, xstop); // определим окно для заполнения
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // DC=0;
SPI2_SendByte(LCD_GRAM);
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
GPIO_SetBits(GPIOB, GPIO_Pin_12); // DC=1;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_Init(SPI2, &SPI_InitStructure);
for(n=0;n<(xstop-xstart+1)*(ystop-ystart+1);n++) { // заполняем цветом область 16ти битными посылками
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, color);
}
while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_Init(SPI2, &SPI_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_11); // CS=1;
}