Решил поиграться с дисплеем nokia 5510 и настроил передачу данных через dma, но возникла проблема с тем, что ножку CE отпускаю в прерывании дожидаясь флага BSY, но все равно рано, т.е. последний байт не успевает дойти до дисплея и пришлось вносить задержку. Послед задержки все работает. А как это правильно сделать? Чтобы без задержек?
На скрине с анализатора видно, что линия CE и DC подымаются раньше...
Спасибо.
Код: Выделить всё
void PCD8544_Init()
{
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_SPI1EN | RCC_APB2ENR_AFIOEN;
PCD8544_GPIO->CRL = (PCD8544_GPIO->CRL & ~(GPIO_CRL_CNF4 | GPIO_CRL_MODE4 | GPIO_CRL_CNF5 | GPIO_CRL_MODE5 |
GPIO_CRL_CNF6 | GPIO_CRL_MODE6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE7)) |
(GPIO_CRL_MODE4 | GPIO_CRL_MODE6 | GPIO_CRL_CNF5_1 | GPIO_CRL_CNF7_1 |
GPIO_CRL_MODE5 | GPIO_CRL_MODE7);
PCD8544_GPIO->CRH = (PCD8544_GPIO->CRH & ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9 | GPIO_CRH_CNF10 | GPIO_CRH_MODE10)) |
(GPIO_CRH_MODE9 | GPIO_CRH_MODE10);
pin_set(PCD8544_DC | PCD8544_RST | PCD8544_CE);
pin_reset(PCD8544_LIGHT);
SPI1->CR1 |= SPI_CR1_BR_2 | SPI_CR1_CPHA | SPI_CR1_CPOL;
SPI1->CR1 |= SPI_CR1_SSI | SPI_CR1_SSM; // software NSS
SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_SPE;
SPI1->CR2 |= SPI_CR2_TXDMAEN;
DMA1_Channel3->CPAR = (uint32_t)&SPI1->DR;
DMA1_Channel3->CCR |= DMA_CCR1_PL_1 | DMA_CCR1_MINC | DMA_CCR1_CIRC | DMA_CCR1_DIR |DMA_CCR1_TCIE;
NVIC_EnableIRQ(DMA1_Channel3_IRQn);
}Код: Выделить всё
extern "C" void DMA1_Channel3_IRQHandler(void)
{
if((DMA1->ISR & DMA_ISR_TCIF3) == DMA_ISR_TCIF3)
{
DMA1_Channel3->CCR &= ~DMA_CCR1_EN;
DMA1->IFCR |= DMA_IFCR_CTCIF3;
while((SPI1->SR & SPI_SR_BSY) != SPI_SR_BSY);
pin_set(PCD8544_CE | PCD8544_DC);
}
}
