/** * @brief Read register value. * @param Reg * @retval None */ uint16_t LCD_IO_ReadData(uint16_t Reg) { uint32_t readvalue = 0; /* Change BaudRate Prescaler 8 for Read */ /* Mean SPI baudrate is set to 72/8 = 9 MHz */ heval_Spi.Instance->CR1 &= 0xFFC7; heval_Spi.Instance->CR1 |= SPI_BAUDRATEPRESCALER_8; /* Send Reg value to Read */ LCD_IO_WriteReg(Reg); /* Reset LCD control line(/CS) and Send command */ LCD_CS_LOW(); /* Send Start Byte */ SPIx_Write(START_BYTE | LCD_READ_REG); /* Read Upper Byte */ SPIx_Write(0xFF); readvalue = SPIx_Read(); readvalue = readvalue << 8; readvalue |= SPIx_Read(); /* Recover Baud Rate initial value */ heval_Spi.Instance->CR1 &= 0xFFC7; heval_Spi.Instance->CR1 |= heval_Spi.Init.BaudRatePrescaler; HAL_Delay(10); /* Deselect : Chip Select high */ LCD_CS_HIGH(); return readvalue; }
/** * @brief Initialize the LCD * @retval None */ void LCD_IO_Init(void) { GPIO_InitTypeDef gpioinitstruct = {0}; /* LCD_CS_GPIO and LCD_DC_GPIO Periph clock enable */ LCD_CS_GPIO_CLK_ENABLE(); LCD_DC_GPIO_CLK_ENABLE(); /* Configure LCD_CS_PIN pin: LCD Card CS pin */ gpioinitstruct.Pin = LCD_CS_PIN; gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP; gpioinitstruct.Pull = GPIO_NOPULL; gpioinitstruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(SD_CS_GPIO_PORT, &gpioinitstruct); /* Configure LCD_DC_PIN pin: LCD Card DC pin */ gpioinitstruct.Pin = LCD_DC_PIN; HAL_GPIO_Init(LCD_DC_GPIO_PORT, &gpioinitstruct); /* LCD chip select high */ LCD_CS_HIGH(); /* LCD SPI Config */ SPIx_Init(); }
void LCDInit(void) { // Initialize SPI Interface Initialize_SPI(); // set pin directions LCD_CS_MAKE_OUT(); LCD_CS_HIGH(); LCD_DC_MAKE_OUT(); LCD_RES_MAKE_OUT(); // Toggle reset pin LCD_RES_LOW(); Delay(1000); LCD_RES_HIGH(); Delay(1000); // Send sequence of command LCDSend(0x21, SEND_CMD); // LCD Extended Commands. LCDSend(0xC8, SEND_CMD); // Set LCD Vop (Contrast). 0xC8 LCDSend(0x04 | !!(LCD_START_LINE_ADDR & (1u << 6)), SEND_CMD); // Set Temp S6 for start line LCDSend(0x40 | (LCD_START_LINE_ADDR & ((1u << 6) - 1)), SEND_CMD); // Set Temp S[5:0] for start line //LCDSend( 0x13, SEND_CMD ); // LCD bias mode 1:48. LCDSend(0x12, SEND_CMD); // LCD bias mode 1:68. LCDSend(0x20, SEND_CMD); // LCD Standard Commands, Horizontal addressing mode. //LCDSend( 0x22, SEND_CMD ); // LCD Standard Commands, Vertical addressing mode. LCDSend(0x08, SEND_CMD); // LCD blank LCDSend(0x0C, SEND_CMD); // LCD in normal mode. // Clear and Update LCDClear(); LCDUpdate(); }
/** * @brief Write register value. * @param pData Pointer on the register value * @param Size Size of byte to transmit to the register * @retval None */ void LCD_IO_WriteData(uint8_t *pData, uint32_t Size) { uint32_t counter = 0; /* Reset LCD control line CS */ LCD_CS_LOW(); /* Send Start Byte */ SPIx_Write(START_BYTE | LCD_WRITE_REG); for (counter = Size; counter != 0; counter--) { while(((heval_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } /* Need to invert bytes for LCD*/ *((__IO uint8_t*)&heval_Spi.Instance->DR) = *(pData+1); while(((heval_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } *((__IO uint8_t*)&heval_Spi.Instance->DR) = *pData; counter--; pData += 2; } /* Wait until the bus is ready before releasing Chip select */ while(((heval_Spi.Instance->SR) & SPI_FLAG_BSY) != RESET) { } /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Read register value. * @param Reg * @retval None */ uint16_t LCD_IO_ReadData(uint16_t Reg) { uint32_t readvalue = 0; /* Send Reg value to Read */ LCD_IO_WriteReg(Reg); /* Reset LCD control line(/CS) and Send command */ LCD_CS_LOW(); /* Send Start Byte */ SPIx_Write(START_BYTE | LCD_READ_REG); /* Read Upper Byte */ SPIx_Write(0xFF); readvalue = SPIx_Read(); readvalue = readvalue << 8; readvalue |= SPIx_Read(); HAL_Delay(10); /* Deselect : Chip Select high */ LCD_CS_HIGH(); return readvalue; }
/** * @brief Writes register value. */ void LCD_IO_WriteData(uint16_t RegValue) { /* Set WRX to send data */ LCD_WRX_HIGH(); /* Reset LCD control line(/CS) and Send data */ LCD_CS_LOW(); SPIx_Write(RegValue); /* Deselect: Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Writes register address. */ void LCD_IO_WriteReg(uint8_t Reg) { /* Reset WRX to send command */ LCD_WRX_LOW(); /* Reset LCD control line(/CS) and Send command */ LCD_CS_LOW(); SPIx_Write(Reg); /* Deselect: Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Write register value. * @param pData Pointer on the register value * @param Size Size of byte to transmit to the register * @retval None */ void LCD_IO_WriteMultipleData(uint8_t *pData, uint32_t Size) { uint32_t counter = 0; __IO uint32_t data = 0; /* Reset LCD control line CS */ LCD_CS_LOW(); /* Set LCD data/command line DC to High */ LCD_DC_HIGH(); if (Size == 1) { /* Only 1 byte to be sent to LCD - general interface can be used */ /* Send Data */ SPIx_Write(*pData); } else { /* Several data should be sent in a raw */ /* Direct SPI accesses for optimization */ for (counter = Size; counter != 0; counter--) { while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } /* Need to invert bytes for LCD*/ *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *(pData+1); while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *pData; counter--; pData += 2; } /* Wait until the bus is ready before releasing Chip select */ while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_BSY) != RESET) { } } /* Empty the Rx fifo */ data = *(&hnucleo_Spi.Instance->DR); UNUSED(data); /* Remove GNU warning */ /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
void lcd_write_data(unsigned char data) { OS_CPU_SR_ALLOC(); OS_ENTER_CRITICAL(); LCD_RS_HIGH(); LCD_CS_LOW(); lcd_send_byte(data); LCD_CS_HIGH(); OS_EXIT_CRITICAL(); }
void lcd_write_cmd(unsigned char cmd) { OS_CPU_SR_ALLOC(); OS_ENTER_CRITICAL(); LCD_RS_LOW(); LCD_CS_LOW(); lcd_send_byte(cmd); LCD_CS_HIGH(); OS_EXIT_CRITICAL(); }
/** * @brief Writes command to select the LCD register. * @param LCDReg: Address of the selected register. * @retval None */ void LCD_IO_WriteReg(uint8_t LCDReg) { /* Reset LCD control line CS */ LCD_CS_LOW(); /* Set LCD data/command line DC to Low */ LCD_DC_LOW(); /* Send Command */ SPIx_Write(LCDReg); /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Writes data to select the LCD register. * This function must be used after st7735_WriteReg() function * @param Data: data to write to the selected register. * @retval None */ void LCD_IO_WriteData(uint8_t Data) { /* Reset LCD control line CS */ LCD_CS_LOW(); /* Set LCD data/command line DC to High */ LCD_DC_HIGH(); /* Send Data */ SPIx_Write(Data); /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
/** * @brief register address. * @param Reg * @retval None */ void LCD_IO_WriteReg(uint8_t Reg) { /* Reset LCD control line(/CS) and Send command */ LCD_CS_LOW(); /* Send Start Byte */ SPIx_Write(START_BYTE | SET_INDEX); /* Write 16-bit Reg Index (High Byte is 0) */ SPIx_Write(0x00); SPIx_Write(Reg); /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Write register value. * @param pData Pointer on the register value * @param Size Size of byte to transmit to the register * @retval None */ void LCD_IO_WriteMultipleData(uint8_t *pData, uint32_t Size) { uint32_t counter = 0; __IO uint32_t data = 0; /* Reset LCD control line(/CS) and Send data */ LCD_CS_LOW(); /* Send Start Byte */ SPIx_Write(START_BYTE | LCD_WRITE_REG); if (Size == 1) { /* Only 1 byte to be sent to LCD - general interface can be used */ /* Send Data */ SPIx_Write(*pData); } else { for (counter = Size; counter != 0; counter--) { while(((heval_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } /* Need to invert bytes for LCD*/ *((__IO uint8_t*)&heval_Spi.Instance->DR) = *(pData+1); while(((heval_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } *((__IO uint8_t*)&heval_Spi.Instance->DR) = *pData; counter--; pData += 2; } /* Wait until the bus is ready before releasing Chip select */ while(((heval_Spi.Instance->SR) & SPI_FLAG_BSY) != RESET) { } } /* Empty the Rx fifo */ data = *(&heval_Spi.Instance->DR); UNUSED(data); /* Remove GNU warning */ /* Reset LCD control line(/CS) and Send data */ LCD_CS_HIGH(); }
void LCDSend(unsigned char data, unsigned char cd) { LCD_CS_LOW(); if (cd == SEND_CHR) { LCD_DC_HIGH(); } else { LCD_DC_LOW(); } // send data over SPI SEND_BYTE_SPI(); LCD_CS_HIGH(); }
void LCD_SendByte(unsigned char a) { unsigned char i,d; LCD_CS_HIGH(); LCD_SIO_OUT(); for(i=0;i<8;i++) { LCD_SCK_LOW(); //clrbit(LCD_CTRL,E); d = a&0x80; if(d) LCD_SIO_HIGH(); //setbit(LCD_CTRL,RW); else LCD_SIO_LOW(); //clrbit(LCD_CTRL,RW); a<<=1; LCD_SCK_HIGH(); //setbit(LCD_CTRL,E); //上升弦发送 } LCD_CS_LOW(); }
/** * @brief Initializes the SD Card and put it into StandBy State (Ready for * data transfer). * @param None * @retval None */ void SD_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; uint8_t counter; /* SD_CS_GPIO Periph clock enable */ SD_CS_GPIO_CLK_ENABLE(); /* Configure SD_CS_PIN pin: SD Card CS pin */ GPIO_InitStruct.Pin = SD_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStruct); /* LCD chip select line perturbs SD also when the LCD is not used */ /* this is a workaround to avoid sporadic failures during r/w operations */ LCD_CS_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = LCD_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LCD_CS_GPIO_PORT, &GPIO_InitStruct); LCD_CS_HIGH(); /*------------Put SD in SPI mode--------------*/ /* SD SPI Config */ SPIx_Init(); /* SD chip select high */ SD_CS_HIGH(); /* Send dummy byte 0xFF, 10 times with CS high */ /* Rise CS and MOSI for 80 clocks cycles */ for (counter = 0; counter <= 9; counter++) { /* Send dummy byte 0xFF */ SD_IO_WriteByte(SD_DUMMY_BYTE); } }
/** * @brief Configures the LCD_SPI interface. * @param None * @retval None */ void LCD_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* Configure the LCD Control pins ------------------------------------------*/ LCD_NCS_GPIO_CLK_ENABLE(); /* Configure NCS in Output Push-Pull mode */ GPIO_InitStruct.Pin = LCD_NCS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW ; HAL_GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStruct); /* Set or Reset the control line */ LCD_CS_LOW(); LCD_CS_HIGH(); SPIx_Init(); }
/** * @brief Configures the LCD_SPI interface. */ void LCD_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; if(Is_LCD_IO_Initialized == 0) { Is_LCD_IO_Initialized = 1; /* Configure NCS in Output Push-Pull mode */ LCD_WRX_GPIO_CLK_ENABLE(); GPIO_InitStructure.Pin = LCD_WRX_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(LCD_WRX_GPIO_PORT, &GPIO_InitStructure); LCD_RDX_GPIO_CLK_ENABLE(); GPIO_InitStructure.Pin = LCD_RDX_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(LCD_RDX_GPIO_PORT, &GPIO_InitStructure); /* Configure the LCD Control pins ----------------------------------------*/ LCD_NCS_GPIO_CLK_ENABLE(); /* Configure NCS in Output Push-Pull mode */ GPIO_InitStructure.Pin = LCD_NCS_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure); /* Set or Reset the control line */ LCD_CS_LOW(); LCD_CS_HIGH(); SPIx_Init(); } }
/** * @brief Initializes the SD Card and put it into StandBy State (Ready for * data transfer). * @param None * @retval None */ void SD_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; uint8_t counter; /* SD_CS_GPIO Periph clock enable */ SD_CS_GPIO_CLK_ENABLE(); /* Configure SD_CS_PIN pin: SD Card CS pin */ GPIO_InitStruct.Pin = SD_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStruct); /* Configure LCD_CS_PIN pin: LCD Card CS pin */ GPIO_InitStruct.Pin = LCD_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStruct); LCD_CS_HIGH(); /*------------Put SD in SPI mode--------------*/ /* SD SPI Config */ SPIx_Init(); /* SD chip select high */ SD_CS_HIGH(); /* Send dummy byte 0xFF, 10 times with CS high */ /* Rise CS and MOSI for 80 clocks cycles */ for (counter = 0; counter <= 9; counter++) { /* Send dummy byte 0xFF */ SD_IO_WriteByte(SD_DUMMY_BYTE); } }
/** * @brief Reads register value. * @param RegValue Address of the register to read * @param ReadSize Number of bytes to read * @retval Content of the register value */ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { uint32_t readvalue = 0; /* Select: Chip Select low */ LCD_CS_LOW(); /* Reset WRX to send command */ LCD_WRX_LOW(); SPIx_Write(RegValue); readvalue = SPIx_Read(ReadSize); /* Set WRX to send data */ LCD_WRX_HIGH(); /* Deselect: Chip Select high */ LCD_CS_HIGH(); return readvalue; }
void main () { LCD_CS_MAKE_OUT(); LCD_CS_HIGH(); LCDInit(); LCDContrast(0x50); LCDStr(0, (unsigned char *)"*** OLIMEX *** ", 1); LCDStr(1, (unsigned char *)" OLIMEXINO ", 0); LCDStr(2, (unsigned char *)" STM32 + ", 1); LCDStr(3, (unsigned char *)" MOD-LCD3310 ", 0); LCDStr(4, (unsigned char *)" using GPIO ", 1); LCDStr(5, (unsigned char *)" interface ", 0); while(1){ sleep(10); } }
void LCD_IO_WriteData(uint16_t LCDData) { /* Reset LCD control line CS */ LCD_CS_LOW(); /* Set LCD data/command line DC to Low */ LCD_DC_HIGH(); //LCD_RW_LOW(); /* Send Command */ //SPIx_Write(LCDReg); LCD_PORT_Value(LCDData >> 8); Toggle_LCD_RW(); //LCD_RW_HIGH(); //LCD_RW_LOW(); /* Send Command */ //SPIx_Write(LCDReg); LCD_PORT_Value(LCDData); Toggle_LCD_RW(); //LCD_RW_HIGH(); /* Deselect : Chip Select high */ LCD_CS_HIGH(); }
/** * @brief Initializes the LCD * @retval None */ void LCD_IO_Init(void) { GPIO_InitTypeDef gpioinitstruct = {0}; /* LCD_CS_GPIO and LCD_DC_GPIO Periph clock enable */ LCD_CS_GPIO_CLK_ENABLE(); LCD_DC_GPIO_CLK_ENABLE(); LCD_RW_GPIO_CLK_ENABLE() ; /* Configure LCD_CS_PIN pin: LCD Card CS pin */ gpioinitstruct.Pin = LCD_CS_PIN; gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP; gpioinitstruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(LCD_CS_GPIO_PORT, &gpioinitstruct); /* Configure LCD_DC_PIN pin: LCD Card DC pin */ gpioinitstruct.Pin = LCD_DC_PIN; HAL_GPIO_Init(LCD_DC_GPIO_PORT, &gpioinitstruct); /* Configure LCD_RW_PIN pin: LCD Card DC pin */ gpioinitstruct.Pin = LCD_RW_PIN; HAL_GPIO_Init(LCD_RW_GPIO_PORT, &gpioinitstruct); /* Configure LCD_RW_PIN pin: LCD Card DC pin */ gpioinitstruct.Pin = LCD_RD_PIN; HAL_GPIO_Init(LCD_RW_GPIO_PORT, &gpioinitstruct); /* Configure LCD_RST PIN pin:*/ gpioinitstruct.Pin = LCD_RST_PIN; HAL_GPIO_Init(LCD_RST_GPIO_PORT, &gpioinitstruct); /* LCD chip select high */ /*LCD_GPIO_PORT config */ gpioinitstruct.Pin = LCD_DATA_PIN_7; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_6; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_5; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_4; //10 HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_3; //9 HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_2; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_1; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); gpioinitstruct.Pin = LCD_DATA_PIN_0; HAL_GPIO_Init(LCD_GPIO_PORT, &gpioinitstruct); //// LCD_CS_HIGH(); /* LCD SPI Config */ // SPIx_Init(); }