CODE
void LcdSpiHandler (void)
{
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE) == RESET);
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_BSY) == SET);
switch(lcd->vState)
{
case(eLcdState_PULSE):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 2)
{
GPIOSet(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_BACK_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_BACK_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 28)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_DATA;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_DATA):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
GPIOSet(lcd->gpioDe);
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
GPIOReset(lcd->gpioDe);
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 479)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_FRONT_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_FRONT_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 12)
{
GPIOReset(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_PULSE;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
}
}
{
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE) == RESET);
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_BSY) == SET);
switch(lcd->vState)
{
case(eLcdState_PULSE):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 2)
{
GPIOSet(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_BACK_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_BACK_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 28)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_DATA;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_DATA):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
GPIOSet(lcd->gpioDe);
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
GPIOReset(lcd->gpioDe);
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 479)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_FRONT_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
case(eLcdState_FRONT_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 12)
{
GPIOReset(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_PULSE;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
}
}
Но к сожалению так оно не взлетает. может есть способ как-то поумнее управлять сигналами управления, а не просто переключать в прерывании. К сожалению в вышеприведенной статье об этом не упоминается. Подскажите кто что думает.