рд╣рдо рдорд┐рддреНрд░ STM32 рдПрд▓рд╕реАрдбреА рдбрд┐рд╕реНрдкреНрд▓реЗ 1604 рдХреЗ рд╕рд╛рде I2C рдмрд╕ (HAL рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдкрд░ рд╣реИрдВ

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ I2C рдмрд╕ рдкрд░ HAL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ STM32 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдПрд▓рд╕реАрдбреА рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдЫрд╡рд┐

рдореИрдВ рдкреНрд░рджрд░реНрд╢рди 1602 рдФрд░ 2004 рдХреЛ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред рдЗрди рджреЛрдиреЛрдВ рдореЗрдВ PCF8574T рдЪрд┐рдк рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓рд╛ I2C рдПрдбрд╛рдкреНрдЯрд░ рд╣реИред рдбрд┐рдмрдЧ рдмреЛрд░реНрдб Nucleo767ZI рд╣реЛрдЧрд╛ , рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг STM32CubeIDE 1.3.0 рд╣реЛрдЧрд╛ред

рдореИрдВ I2C рдмрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо

рдЫрд╡рд┐

рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо I2C1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UART5 рдХреЛ рднреА рдХрдиреЗрдХреНрдЯ рдХрд░реВрдВрдЧрд╛, рдбрд┐рд╕реНрдкреНрд▓реЗ рдПрдбреНрд░реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд░реНрдб рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЫрд╡рд┐

рдЫрд╡рд┐

рдЙрд╕реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЖрдк рдЙрди рдкреИрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:

рдЫрд╡рд┐

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдореИрдВ 1602 рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ USB-UART CH3L рдПрдбрд╛рдкреНрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реВрдБрдЧрд╛, рдЬрд┐рд╕реЗ рдЕрдиреБрднрд╡реА arduin рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреЛрд░реНрдб рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЫрд╡рд┐

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдбреЗрдкреНрдЯрд░ RX рдХреЛ TX рдФрд░ TX рдХреЛ RX рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдПрдбреЙрдкреНрдЯрд░ рдкрд░ рдЬрдореНрдкрд░ 3.3V рд╣реИ

рдЫрд╡рд┐

рдЪрд▓рд┐рдП PCF8574T рдЪрд┐рдк рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдЖрд░реЗрдЦ рд╣реИ:

рдЫрд╡рд┐

PCF8574T рдЪрд┐рдк рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ 74hc595 рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ - рдпрд╣ I2C рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ (P0-P7) рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдЯ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХреНрд░рд┐рдХрд┐рдЯ рдХреЗ рдХреМрди рд╕реЗ рдкрд┐рди рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:

  • Microcircuit рдХрд╛ рдЯрд░реНрдорд┐рдирд▓ P0 рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ RS рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдбреЗрдЯрд╛ (1) рдпрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдСрдкрд░реЗрд╢рди рдирд┐рд░реНрджреЗрд╢ (0) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ;
  • рдкрд┐рди P1 R \ W рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рдЕрдЧрд░ 1 - рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВ, 0 - рдкрдврд╝реЗрдВ;
  • рдЯрд░реНрдорд┐рдирд▓ рдкреА 2 рд╕реАрдПрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ - рдЯрд░реНрдорд┐рдирд▓, рдЬрд┐рд╕ рдкрд░ рд░рд╛рдЬреНрдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкрдврд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ;
  • рдирд┐рд╖реНрдХрд░реНрд╖ рдкреА 3 - рдмреИрдХрд▓рд╛рдЗрдЯ рдирд┐рдпрдВрддреНрд░рдг;
  • рдирд┐рд╖реНрдХрд░реНрд╖ рдкреА 4 - рдкреА 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ I2C рдмрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдкрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред рдпрджрд┐ рдПрдбреЙрдкреНрдЯрд░ рдмреЛрд░реНрдб рдкрд░ рд╕рдВрдкрд░реНрдХ A1, A2 рдФрд░ A3 рдХреЛ рд╕реАрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкрддрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ 0x27 рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ I2C рдмрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкрддреЗ рджрд┐рдЦрд╛рдПрдЧрд╛:

void I2C_Scan ()
{
	//  ,  
        HAL_StatusTypeDef res;                          
	//    
        char info[] = "Scanning I2C bus...\r\n";      
        //    UART	
        HAL_UART_Transmit(&huart5, (uint8_t*)info, strlen(info), HAL_MAX_DELAY);  
	/* &huart5 -   UART
	 * (uint8_t*)info -     
	 * strlen(info) -   
	 * HAL_MAX_DELAY - 
	 */
        //    
	for(uint16_t i = 0; i < 128; i++)              
	{
            // ,      i  
            res = HAL_I2C_IsDeviceReady(&hi2c1, i << 1, 1, HAL_MAX_DELAY);                   
	    //  , 
            if(res == HAL_OK)                              
	    {
	    	char msg[64];
	    	//   i,   ,     
                // 16 :
	    	snprintf(msg, sizeof(msg), "0x%02X", i);
	    	//    
	    	HAL_UART_Transmit(&huart5, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
	    	//    
	    	HAL_UART_Transmit(&huart5, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
	    }
	    else HAL_UART_Transmit(&huart5, (uint8_t*)".", 1, HAL_MAX_DELAY);
	}
	HAL_UART_Transmit(&huart5, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
}

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди 0 рд╕реЗ 127 рддрдХ рдХреЗ рд╕рднреА рдкрддреЛрдВ рдХреЛ рдкреЛрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЗрд╕ рдПрдбреНрд░реЗрд╕ рд╕реЗ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдбреНрд░реЗрд╕ рдирдВрдмрд░ рдХреЛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд░реВрдк рдореЗрдВ UART рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред

рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреАрдордХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдпреВрдПрдЖрд░ рдЧрддрд┐ 115200 рдкрд░ рд╕реЗрдЯ рд╣реИ, рдЖрдкрдХреЛ рджреАрдордХ рдореЗрдВ рд╣реА рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдореБрдЦреНрдп рдирд┐рдХрд╛рдп рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдмреЛрд░реНрдб рдХреЛ рдлреНрд▓реИрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рджреАрдордХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдбреЙрдЯреНрд╕ рдЙрди рд╕рднреА рдкрддреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдореЗрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкрддрд╛ 0x26 рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЬрдореНрдкрд░ A0 рдХреЛ рдорд┐рд▓рд╛рдпрд╛ рдерд╛ред рдЕрдм рджреВрд╕рд░реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрдпрд╛ рджреЗрдЧрд╛:

рдЫрд╡рд┐

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкрддреЗ рд╣реИрдВ: 0x26 (рдкреНрд░рджрд░реНрд╢рди 1602) рдФрд░ 0x27 (рдкреНрд░рджрд░реНрд╢рди 2004)ред рдЕрдм рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдПрдХ рдкрддрд╛ рдмрд╛рдЗрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдмрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдЙрдкрдХрд░рдг рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЪрд░рд┐рддреНрд░ рдХреА рдЧрд┐рдирддреА рдХрд╣рд╛рдВ рд╕реЗ рдФрд░ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдПрдЧреА, рдХрд░реНрд╕рд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдЖрджрд┐ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 4 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдбреЗрдЯрд╛ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдЯрд╛ рдХреЛ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ (4-7) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдореНрди рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмреИрдХрд▓рд╛рдЗрдЯ рдЪрд╛рд▓реВ рд╣реЛрдЧрд╛ (3 рдмрд┐рдЯреНрд╕), рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЖ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЖрд░рдПрд╕ рдЖрдЙрдЯрдкреБрдЯ, 0 рдмрд┐рдЯреНрд╕), рдФрд░ 2 рдмрд┐рдЯреНрд╕, рдЬрд┐рд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд░реАрдбрд┐рдВрдЧ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреНe рдХреЛ 1 рдмрд╛рдЗрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 4 рдмрд╛рдЗрдЯреНрд╕ рднреЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рдореЗрдВ 4 рдмрд┐рдЯреНрд╕ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА, 2 рдмрд┐рдЯ рд╕реНрдЯреЗрдЯ рдЯреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 2 рдмрд╛рдЗрдЯ 1 рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ, рдХреЗрд╡рд▓ 2 рдмрд┐рдЯ рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдПред 0. 3 рдпрд╛ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдбреЗрдЯрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

void I2C_send(uint8_t data, uint8_t flags)
{
	HAL_StatusTypeDef res;
	 //     
        for(;;) {
                // ,      lcd_addr                                                                                        
	        res = HAL_I2C_IsDeviceReady(&hi2c1, LCD_ADDR, 1, HAL_MAX_DELAY);               
	         //  ,     
                if(res == HAL_OK) break;                                                  
	    }
        //    1111 0000      0  3,    4  7
	uint8_t up = data & 0xF0;   
        //   ,  data   4                	
        uint8_t lo = (data << 4) & 0xF0;          
                                          
	uint8_t data_arr[4];
         // 4-7   ,  0-3   
	data_arr[0] = up|flags|BACKLIGHT|PIN_EN; 
         //  ,       0  
	data_arr[1] = up|flags|BACKLIGHT;         
	data_arr[2] = lo|flags|BACKLIGHT|PIN_EN;
	data_arr[3] = lo|flags|BACKLIGHT;

	HAL_I2C_Master_Transmit(&hi2c1, LCD_ADDR, data_arr, sizeof(data_arr), HAL_MAX_DELAY);
	HAL_Delay(LCD_DELAY_MS);
}

рдЗрд╕реЗ рдХреНрд░рдо рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдореЗрдВ рдРрд╕реЗ рдЪрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдПрдбреНрд░реЗрд╕, рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдкрддреЗ рдкрд░ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВред HAL_OK рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рднреЗрдЬреЗрдВрдЧреЗ, рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рджреЛрдиреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдкрд░ рд▓рд┐рдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░рд┐рддреНрд░ 's' рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рдмрд╛рдЗрдирд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдпрд╣ 1110011 ( рдХреИрд▓рдХреБрд▓реЗрдЯрд░) рд╣реИ) рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╣рдо = 01110000 рдХреЛ рдЪрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд▓рд┐рдЦреЗрдВред рдХрдо-рдХреНрд░рдо рдмрд┐рдЯреНрд╕ рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ 4 рд╡рд░реНрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪрд░ рд▓реЛ = 00110000 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЧреЗ, рд╣рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░рд┐рддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдЕрдм рд╣рдо рдореМрдЬреВрджрд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд┐рдЯреНрд╕ (0-3 рдмрд┐рдЯреНрд╕) рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкрддрд╛ рдмрд╛рдЗрдЯ рдФрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ HAL_I2C_Master_Transmit () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬрддреЗ рд╣реИрдВ;

рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдордд рдХрд░реЛ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдкрдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рдЗрдЯ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрдиреБрд╡рд╛рдж рдЯреЗрдмрд▓ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЖрдпрд╛ рдЬреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╣реИрдВ:

  I2C_send(0b00110000,0);   // 8  
  I2C_send(0b00000010,0);   //     
  I2C_send(0b00001100,0);   //   ,  
  I2C_send(0b00000001,0);   //  

рд╣рдо рдЗрди рдХрдорд╛рдВрдб рдХреЛ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рдмрд╛рд░ рднреЗрдЬрд╛ рдЬрд╛рдП (рдЬреИрд╕реЗ рдХрд┐ рдЕрд░рдбреНрдпреВрдХреА рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗрдЯрдЕрдк)ред I2C_send рдлрд╝рдВрдХреНрд╢рди, рдмрд╛рдЗрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдпрд╛ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ 0 рд╣реИ, рддреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдФрд░ рдпрджрд┐ 1, рддреЛ рдбреЗрдЯрд╛ред

рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ - рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдордп рд╕реАрдорд╛ рдЪрд░рд┐рддреНрд░-рджрд░-рд╡рд░реНрдг рднреЗрдЬ рджреЗрдЧрд╛ред рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

void LCD_SendString(char *str)
{
    // *char    
    //    
	while(*str) 
        {                                   
                //    
		I2C_send((uint8_t)(*str), 1); 
                //     1               
                str++;                                     
        }
}

рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХрддреНрд░рд┐рдд рдХрд░рдХреЗ, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

  LCD_SendString("  Hello");
  I2C_send(0b11000000,0);   //  
  LCD_SendString("    Habr");

рдЫрд╡рд┐

рдареАрдХ рд╣реИ, рд╣рдордиреЗ 1602 рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдЕрдм 2004ред рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдиреНрдпреВрдирддрдо рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рдХреЛрдб рднреА рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рднреА рдЕрдВрддрд░ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдкрддреЗ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ, рдореЗрдореЛрд░реА рдореЗрдВ 80 рд╕реЗрд▓реНрд╕ рд╣реИрдВ, 1602 рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ, рдкрд╣рд▓реА рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ 16 рд╕реЗрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП 40 рд╕реЗ 56 рд╕реЗрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рд╢реЗрд╖ рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк 17 рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдФрд░ рдПрдХ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рд╣реИред рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдореЗрдореЛрд░реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

рдЫрд╡рд┐

рд▓рд╛рдЗрди рдлреАрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ I2C_send рдХрдорд╛рдВрдб (0b11000000,0) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛; , рдпрд╣ рд╕рд┐рд░реНрдл 40 рд╕реЗрд▓ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред 2004 рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛрд╢рд┐рдХрд╛рдПрдВ 1 рд╕реЗ 20 рд╣реИ
рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ 40 рд╕реЗ 60 рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ
рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ - 21 рд╕реЗ 40
рддрдХ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЪреМрдереА рдкрдВрдХреНрддрд┐ - 60 рд╕реЗ 80 рддрдХ рдХреЛрд╢рд┐рдХрд╛рдПрдВ,
рдЕрд░реНрдерд╛рддреНред рдпрджрд┐ рдЖрдк рдПрдХ рдЖрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ

LCD_SendString("___________________1___________________2___________________3___________________4");

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░реНрд╕рд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдм рддрдХ рдореИрдиреБрдЕрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдмрд╕ рдЧрдпрд╛ рд╣реВрдВ:

  I2C_send(0b10000000,0);   //   1 
  LCD_SendString("  Hello Habr");
  I2C_send(0b11000000,0);   //   2 
  LCD_SendString(" STM32 + LCD 1602");
  I2C_send(0b10010100,0);   //   3 
  LCD_SendString(" +LCD 2004A");
  I2C_send(0b11010100,0);   //   4 
  LCD_SendString(" library HAL");

рдкрд░рд┐рдгрд╛рдо:

рдЫрд╡рд┐

рд╢рд╛рдпрдж рдпреЗ рд╕рдм рдЗрди рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рд╣реИ, рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ рдЬрд┐рд╕рдХреА рдмрджреМрд▓рдд рдореИрдВ рдЗрд╕реЗ рд╕рдордЭ рдкрд╛рдпрд╛ред

  1. рдХреЛрдб рдПрдХ рдмрд╣реБрдд рджреЗрдЦрд╛ рдпрд╣рд╛рдБ
  2. рдкреНрд░рджрд░реНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдиреЗ рдпрд╣рд╛рдВ рджреЗрдЦрд╛
  3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╣рд╛рдБ

рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдбреЗрдЯрд╛рд╢реАрдЯ

рдкреАрдПрд╕: рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЪрдордХ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

All Articles