// Analog SPI void AspiCmd(u8 Command_Byte) { int i=8; LCD_A0_LOW(); LCD_CLK_HIGH(); LCD_CLK_HIGH(); LCD_NCS_LOW(); while (i--) { LCD_CLK_LOW(); if (Command_Byte&0x80) LCD_MOSI_HIGH(); else LCD_MOSI_LOW(); Command_Byte <<= 1; LCD_CLK_LOW(); \ LCD_CLK_LOW(); \ LCD_CLK_HIGH(); LCD_CLK_HIGH(); } LCD_NCS_HIGH(); LCD_A0_HIGH(); }
/** Init the anolog spi gpio */ static void LCD_Hardware_Init() { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_LCD, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; /*!< Configure lcd CLK\ MOSI\ A0pin in output pushpull mode *************/ GPIO_InitStructure.GPIO_Pin = PIN_LCD_MOSI | PIN_LCD_CLK | PIN_LCD_A0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIO_LCD_SPI, &GPIO_InitStructure); LCD_NCS_HIGH(); /*!< Configure lcd NCS pin in output pushpull mode ,PULLUP *************/ GPIO_InitStructure.GPIO_Pin = PIN_LCD_NCS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIO_LCD_NCS, &GPIO_InitStructure); /*!< Configure lcd RST pin in output pushpull mode ,PULLUP *************/ GPIO_InitStructure.GPIO_Pin = PIN_LCD_RST; GPIO_Init(GPIO_LCD_RST, &GPIO_InitStructure); }
void lcdRefresh() { for (uint32_t y=0; y<LCD_H; y++) { uint8_t *p = &displayBuf[(y>>3)*LCD_W]; uint8_t mask = (1 << (y%8)); Set_Address(0, y); AspiCmd(0xAF); LCD_CLK_HIGH(); LCD_A0_HIGH(); LCD_NCS_LOW(); for (uint32_t x=0; x<LCD_W; x++) { LCD_WRITE_BIT(p[3*DISPLAY_PLAN_SIZE+x] & mask); LCD_WRITE_BIT(p[2*DISPLAY_PLAN_SIZE+x] & mask); LCD_WRITE_BIT(p[DISPLAY_PLAN_SIZE+x] & mask); LCD_WRITE_BIT(p[x] & mask); } LCD_NCS_HIGH(); LCD_A0_HIGH(); WriteData(0); } }
/*************************************************************************************************** * @fn lcd_data_write * * @brief LCD字节写入 * @param NULL * @return 0 -- success ***************************************************************************************************/ void lcd_data_write(uint8_t data) { LCD_A0_HIGH(); LCD_NCS_LOW() while ( ( LCD_SPI_MASTER->SR & SPI_SR_TXE ) == 0 ) {}; (void)LCD_SPI_MASTER->DR ; // Clear receive LCD_SPI_MASTER->DR = data ; while ( ( LCD_SPI_MASTER->SR & SPI_SR_RXNE ) == 0 ) {}; LCD_NCS_HIGH(); return 0; }
/*************************************************************************************************** * @fn lcd_cmd_write * * @brief LCD命令写入 * @param NULL * @return 0 -- success ***************************************************************************************************/ int lcd_cmd_write(uint8_t cmd) { LCD_A0_LOW(); LCD_NCS_LOW() while ( ( LCD_SPI_MASTER->SR & SPI_SR_TXE ) == 0 ) {}; (void)LCD_SPI_MASTER->DR ; // Clear receive LCD_SPI_MASTER->DR = cmd ; while ( ( LCD_SPI_MASTER->SR & SPI_SR_RXNE ) == 0 ) {}; LCD_NCS_HIGH(); return 0; }
void AspiCmd(uint8_t Command_Byte) { LCD_A0_LOW() ; LCD_NCS_LOW() ; while ( ( SPI3->SR & SPI_SR_TXE ) == 0 ) { // wait } (void)SPI3->DR ; // Clear receive SPI3->DR = Command_Byte ; while ( ( SPI3->SR & SPI_SR_RXNE ) == 0 ) { // wait } LCD_NCS_HIGH() ; }
/** * @brief Send a byte to LCD * @param DataType Type of Data to be sent * @param DataToSend Data to be sent * @retval None */ void LCD_SendByte(uint8_t DataType, uint8_t DataToSend) { /* Enable access to LCD */ LCD_NCS_HIGH(); /* Send Synchro/Mode byte */ LCD_SPISendByte(DataType); /* Send byte high nibble */ LCD_SPISendByte((uint8_t)(DataToSend & (uint8_t)0xF0)); /* Send byte low nibble */ LCD_SPISendByte((uint8_t)((uint8_t)(DataToSend << 4) & (uint8_t)0xF0)); _delay_(80); /* Disable access to LCD */ LCD_NCS_LOW(); }
//Anolog spi void AspiData(u8 Para_data) { int i=8; LCD_CLK_HIGH(); LCD_A0_HIGH(); LCD_NCS_LOW(); while (i--) { LCD_CLK_LOW(); if (Para_data&0x80) LCD_MOSI_HIGH(); else LCD_MOSI_LOW(); Para_data <<= 1; __no_operation(); LCD_CLK_HIGH(); __no_operation(); } LCD_NCS_HIGH(); LCD_A0_HIGH(); }
/*************************************************************************************************** * @fn lcd_dma_irq_handler_callback * * @brief LCD DMA写入中断回调函数,完成关闭DMA * @param NULL * @return NULL ***************************************************************************************************/ void lcd_dma_irq_handler_callback(void) { if(DMA_GetITStatus(LCD_DMA_STREAM, LCD_DMA_TC_FLAG) != RESET) { DMA_Cmd(LCD_DMA_STREAM,DISABLE); DMA_ClearITPendingBit(LCD_DMA_STREAM, LCD_DMA_TC_FLAG); DMA_ITConfig(LCD_DMA_STREAM, DMA_IT_TC, DISABLE); SPI_I2S_DMACmd(LCD_SPI_MASTER,SPI_I2S_DMAReq_Tx,DISABLE); while ( LCD_SPI_MASTER->SR & SPI_SR_BSY ) { /* Wait for SPI to finish sending data The DMA TX End interrupt comes two bytes before the end of SPI transmission, therefore we have to wait here. */ } LCD_NCS_HIGH(); g_LcdWriteBusyFlag = 0; printf("enter in lcd dma irq @ %s, %s, %d\r\n", __FILE__, __func__, __LINE__); } }
void AspiCmd(uint8_t Command_Byte) { int i=8; LCD_A0_LOW(); LCD_CLK_HIGH(); LCD_NCS_LOW(); while (i--) { LCD_CLK_LOW(); if(Command_Byte&0x80) { LCD_MOSI_HIGH(); } else LCD_MOSI_LOW(); Command_Byte=Command_Byte<<1; LCD_CLK_HIGH(); } LCD_NCS_HIGH(); LCD_A0_HIGH(); }