Здравствуйте,
Столкнулся с непонятной для меня проблемой запуска графического контроллера FT800 через 1986ВЕ1Т.
Вся работа производится с отладочными платами LDM-HELPER-K1986BE1QI-FULL и VM800C43A-D. Среда программирования Keil 5.
Работаю руководствуясь данной статьей и демонстрационным примером для ARM.
После инициализации, управляющий конnроллер должен получить от FT800 идентификатор 0x7C, который говорит о том что инициализация прошла успешно и можно работать дальше. Проблема состоит в том, что ничего подобного он не получает. Я больше склоняюсь к тому, что неправильно настроил SPI, вследствие чего 1986ВЕ1Т шлет некорректные команды.
Отладочная плата с FT800 работает, проверяли подключив к плате ардуино.
Схема подключения на картинке, справа графический контроллер, слева 1986ВЕ1:
void SPI1_Init(void) //инициализация SPI
{
SSP_InitTypeDef SSP_InitStructure;
PORT_InitTypeDef GPIO_user_ini;
RST_CLK_PCLKcmd(PCLK_BIT(MDR_SSP1_BASE), ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC , ENABLE);
GPIO_user_ini.PORT_Pin = PORT_Pin_5 | PORT_Pin_6 | PORT_Pin_7;
GPIO_user_ini.PORT_FUNC = PORT_FUNC_ALTER;
GPIO_user_ini.PORT_MODE = PORT_MODE_DIGITAL;
GPIO_user_ini.PORT_SPEED = PORT_SPEED_SLOW;
GPIO_user_ini.PORT_OE = PORT_OE_OUT;
PORT_Init(MDR_PORTC, &GPIO_user_ini);
SSP_DeInit(MDR_SSP1);
SSP_BRGInit(MDR_SSP1, SSP_HCLKdiv1);
SSP_InitStructure.SSP_SCR = 0x10;
SSP_InitStructure.SSP_CPSDVSR = 12;
SSP_InitStructure.SSP_Mode = SSP_ModeMaster;
SSP_InitStructure.SSP_WordLength = SSP_WordLength8b;
SSP_InitStructure.SSP_SPH = SSP_SPH_1Edge;
SSP_InitStructure.SSP_SPO = SSP_SPO_Low;
SSP_InitStructure.SSP_FRF = SSP_FRF_SPI_Motorola;
SSP_InitStructure.SSP_HardwareFlowControl = SSP_HardwareFlowControl_SSE;
SSP_Init(MDR_SSP1, &SSP_InitStructure);
SSP_ITConfig(MDR_SSP1, SSP_IT_RX | SSP_IT_RT | SSP_IT_TX | SSP_IT_ROR, ENABLE);
SSP_Cmd(MDR_SSP1, ENABLE);
}
void ft800cmdWrite(unsigned char ftCommand) //функция для отправки команды по SPI
{
unsigned char cZero = 0x00;
CS_RESET;
SSP_SendData(MDR_SSP1, ftCommand); // Отправляем команду
SSP_SendData(MDR_SSP1, cZero); // Отправляем первый нулевой байт
SSP_SendData(MDR_SSP1, cZero); // Отправляем второй нулевой байт
//CS_SET; // тут почему то когда перевожу CS на высокий уровень, ничего не работает, и дисплей не включается
}
//---------------------------------------*
unsigned char ft800memRead8(unsigned long ftAddress) // Здесь происходит чтение идентификатора REG ID для проверки корректного завершения этапа инициализации
{
unsigned char ftData8 = ZERO; // Place-holder for 8-bits being read
unsigned char cTempAddr[3]; // FT800 Memory Address
unsigned char cZeroFill = ZERO; // Dummy byte
cTempAddr[2] = (char) (ftAddress >> 16) | MEM_READ; // Compose the command and address to send
cTempAddr[1] = (char) (ftAddress >> 8); // middle byte
cTempAddr[0] = (char) (ftAddress); // low byte
CS_RESET; // Set chip select low
for (i = 2; i >= 0; i--)
{
SSP_SendData(MDR_SSP1, cTempAddr[i]); // Send Memory Write plus high address byte
}
SSP_SendData(MDR_SSP1, cZeroFill); // Send dummy byte
for (j = 0; j < sizeof(ftData8); j++) // Start with least significant byte
{
while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_BSY) == 1){}
if (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE) == 1)
{
ftData8 = SSP_ReceiveData(MDR_SSP1); // Receive data byte
}
}
CS_SET; // Set chip select high
return ftData8; Return 8-bits
}
//---------------------------------------------------------
//---------------------------------------------------------
//Тут начинается основная программа.
Init_PORT_INT_PD(); //Инициализация портов PD, CS, INT//
SPI1_Init(); //Инициализация SPI
PD_SET; // формируем
delay_ms(20); // импульс
PD_RESET; // длительностью
delay_ms(20); // 20 мс
PD_SET; // в активном режиме на линии PD всегда высокий уровень
// Дисплей включается и без формирования этого импульса, главное
// что бы в PD оставался высокий уровень
ft800cmdWrite(FT800_ACTIVE); // тут шлем команды FT800_ACTIVE = 0х00,
delay_ms(5); // FT800_CLKEXT = 0x44
ft800cmdWrite(FT800_CLKEXT); // FT800_CLK48M = 0x62
delay_ms(5); // между ними 5 мс для того чтобы FT800
ft800cmdWrite(FT800_CLK48M); // обрабатывать команды
delay_ms(5);
if (ft800memRead8(REG_ID) != 0x7C) // чтение идентификатора REG ID для проверки корректного завершения этапа инициализации
{
while(1) {LED0_ON;} //если не получаем данный идентификатор, то нету смысла продолжать дальше
}
При включении дисплей загорается белым цветом и больше ничего не происходит.