[ARM] Help with interfacing GLCD with stm32 through spi

Status
Not open for further replies.

swa1

Newbie
Joined
Oct 19, 2018
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
31
Hi,
I am trying to interface GLCD TM12864H6CCGWA-1 (controller st7567s) with STM32L031F4P6 through SPI communication.
PLease help me with this code , its not working with hardware.
Code:
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l0xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/*LCD RST */
# define LCD_RST1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
# define LCD_RST0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);

/*LCD CS */
# define LCD_CS1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
# define LCD_CS0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);

/* LCD RS */
# define LCD_RS1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);//A0
# define LCD_RS0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);


/* LCD SCK */
# define LCD_SCK1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);//SCK
# define LCD_SCK0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

/* LCD MOSI */
# define LCD_MOSI1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);//SDA
# define LCD_MOSI0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
uint8_t data_t[2];

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

void lcd_send_cmd(unsigned char cmd)
{
 unsigned char data_u;
 int i;
	
 uint8_t data_t[2];
 data_u= cmd&0x0f;	
 data_t[0]=data_u|0x04;
 data_t[1]=data_u;
 LCD_RS0;
 LCD_CS0;
 for(i=0;i<8;i++){
	 if( cmd & 0x0f){
		 LCD_MOSI1;}
	 else
		 {LCD_MOSI0;}
		 
		 LCD_SCK1;
		 HAL_Delay(100);
		 LCD_SCK0;
		 cmd<<=1;
		 
 HAL_SPI_Transmit(&hspi1,data_t,2,100);
	 }
 LCD_CS1;
}

void lcd_send_data(unsigned char data)
{
   
  
	int i;
	 unsigned char data_u;
	 uint8_t data_t[2];
	 data_u= data&0x0f;

	 data_t[0]=data_u|0x05;
	 data_t[1]=data_u;
	 LCD_RS1;
	 LCD_RST0;
	 LCD_CS0;
	for(i=0;i<8;i++)
	{

	  if (data & 0x0f)
	{
		LCD_MOSI1}
     else {LCD_MOSI0}

	
	 LCD_SCK1;
	 HAL_Delay(100);	 
	  LCD_SCK0;
		data<<=1;
	 HAL_SPI_Transmit(&hspi1,data_t,2,100);
	 } 
   LCD_CS1;

}

void set_rr(char rr)	//0<=rr<=7
{
  LCD_RS0;
	lcd_send_data((0x20)|((rr)&(0x07)));
}
void set_ev(char ev)	//0<=ev<=63
{	//It is recommended the EV should be close to the center (1FH) for easy contrast adjustment
	LCD_RS0;
	lcd_send_data(0x81);
	lcd_send_data(((0x3F)&(ev)));
}
void power_control(char dat)	//0<=dat<=7 
//dat=1: Built-in Follower ON
//dat=2: Built-in Regulator ON
//dat=4: Built-in Booster ON
{
	LCD_RS0;
	dat=((dat)&(0x07));
	lcd_send_data(((0x28)|(dat)));
}
void lcd_Init(void)

{

  LCD_RS0;
	LCD_CS1;
	LCD_RST0;
	HAL_Delay(100);
	LCD_RST1;
	
   lcd_send_cmd (0xE2);//Sw RESWT
	 HAL_Delay(100);
	  
   lcd_send_cmd (0xA2);//LCD bias
	 HAL_Delay(100);
	  
   lcd_send_cmd (0xAF);//display on
	 HAL_Delay(100);
   
   lcd_send_cmd (0xA0);//Segment direction
	 HAL_Delay(100);
	
   lcd_send_cmd (0xC8);//common direction
	 HAL_Delay(100);
	 
   set_rr(0x04);//Regulation resistor select
	 HAL_Delay(100);
	 
   set_ev(0x1F);;//EV select
	 HAL_Delay(100);
	 
	 power_control(0x07);	//ALL Power Control ON
	 HAL_Delay(100);
	  
	 	
   lcd_send_cmd (0x40);//Initial display line 40
	 HAL_Delay(100);
	 	
   lcd_send_cmd (0xB0);//set page address
	 HAL_Delay(100);
	 
   lcd_send_cmd (0x10);//set colmn address MSB
	 HAL_Delay(100);
	 	
   lcd_send_cmd (0x00);//set column address LSB
	 HAL_Delay(100);
	 
   lcd_send_cmd (0xAF);//display on
	 HAL_Delay(100);
	 lcd_send_cmd (0xA4);//normal display , all pixels on
	 HAL_Delay(100);
 
}


void lcd_send_string (char *str)

{
    while (*str) lcd_send_data (*str++);

}
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  
  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

 

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
  
	LCD_SCK1;
	LCD_CS0;
	LCD_RST0;
	HAL_Delay(100);
	LCD_RST1;
  HAL_Delay(100);
	lcd_Init();
  lcd_send_cmd(0x29);
	HAL_Delay(100);
	printf("hi");
  lcd_send_string("hello hello");
	printf("IS it working? ");
 /* while(1)
   {
     int i;
		 i = 0;
      for(i = 0; i < 63; i++)
      {
         lcd_send_cmd(0x00+i);
         lcd_send_data(0xff);
         HAL_Delay(100);
      }
   }*/

  
	LCD_CS1;
  /* USER CODE END 2 */


}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
 
	//Enable power control clock
	
	__HAL_RCC_PWR_CLK_ENABLE();
	
    /**Configure the main internal regulator output voltage 
    */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_3;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV8;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
	__HAL_RCC_SPI1_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pins : RST_Pin RS_Pin */
  GPIO_InitStruct.Pin = RST_Pin|RS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : CS_Pin */
  GPIO_InitStruct.Pin = CS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(CS_GPIO_Port, &GPIO_InitStruct);


  /*Configure SPI pin : MOSI_Pin,SCK_Pin */
/*  GPIO_InitStruct.Pin = MOSI_Pin|SCK_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
//	GPIO_InitStruct.Alternate=GPIO_AF_SPI1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);*/
	
	__HAL_SPI_ENABLE(&hspi1);
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 

Hi,

don´t be surprised if there is no feedback.

No one will take the effort to go through your code to find out what´s wrong.

Please give useful informations first and show your own effort.
* post your schematic
* give a detailed error description
* show what you have already done to debug your code and what were the results.
* show scope pictures

Klaus
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…