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


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


 интересная позиция
 интересная позиция  я так наоборот рад когда мне подсказывают правильные решения... - последний раз указанное мне правильное решение позволило увеличить быстродействие на 20%... хотя я тоже думал что написал "максимально эффективно" и ничего другого уже придумать нельзя
 я так наоборот рад когда мне подсказывают правильные решения... - последний раз указанное мне правильное решение позволило увеличить быстродействие на 20%... хотя я тоже думал что написал "максимально эффективно" и ничего другого уже придумать нельзя  )) (смотреть комменты к статье https://habrahabr.ru/post/276121/ )
)) (смотреть комменты к статье https://habrahabr.ru/post/276121/ )
То вы проверку 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;
}
 ))
)) поэтому BSY можно не проверять, а работать одним только TXE, хотя это не верно ! например перед отключением CS карты желательно все таки проверить BSY, а то еще глюканет - но там спасает достаточно большое количество команд между отправкой последнего байта и отключением CS и как правило ни на что не влияет. Опять таки если вам нужно будет максимальное быстродействие от SD карты - то придется и там озадачиться...
 поэтому BSY можно не проверять, а работать одним только TXE, хотя это не верно ! например перед отключением CS карты желательно все таки проверить BSY, а то еще глюканет - но там спасает достаточно большое количество команд между отправкой последнего байта и отключением CS и как правило ни на что не влияет. Опять таки если вам нужно будет максимальное быстродействие от SD карты - то придется и там озадачиться... ) и рассуждают о глюках во времени
) и рассуждают о глюках во времени  ))
)) ))
))
 )
)
