zoukankan      html  css  js  c++  java
  • stm32模拟iic从机程序

    个人记录,保存在此处,逻辑能用,但是通讯速率只能小于5K,但是可以优化(改为用寄存器操作)

    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
      * All rights reserved.</center></h2>
      *
      * This software component is licensed by ST under BSD 3-Clause license,
      * the "License"; You may not use this file except in compliance with the
      * License. You may obtain a copy of the License at:
      *                        opensource.org/licenses/BSD-3-Clause
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "adc.h"
    #include "gpio.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
    {
      /* Configure the SysTick to have interrupt in 100us time basis*/
      if (HAL_SYSTICK_Config(SystemCoreClock / (10000U / uwTickFreq)) > 0U)
      {
        return HAL_ERROR;
      }
    
      /* Configure the SysTick IRQ priority */
      if (TickPriority < (1UL << __NVIC_PRIO_BITS))
      {
        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
        uwTickPrio = TickPriority;
      }
      else
      {
        return HAL_ERROR;
      }
    
      /* Return function status */
      return HAL_OK;
    }
    
    void HAL_Delay(uint32_t Delay)
    {
      uint32_t tickstart = HAL_GetTick();
      uint32_t wait = Delay;
    
      if (wait == 0)
      {
        wait = 1;
      }
    
      while((HAL_GetTick() - tickstart) < wait)
      {
      }
    }
    
    void HAL_Delay_100us(uint32_t Delay)
    {
         HAL_Delay(Delay);
    }
    
    void HAL_Delay_100us_d(int j){
        int i=27;
        int k=27;
        int m=27;
        int n=27;
    
        while(i--);
        while(k--);
        while(m--);
        while(n--);
    }
    
    
    /*********************** iic begin *****************************/
    
    
    /*********************** iic end *******************************/
    
    uint16_t get_adc(uint32_t channel)
    {
        ADC_ChannelConfTypeDef sConfig = {0};
        
        sConfig.Channel = ADC_CHANNEL_MASK;  //disabled all channel
        sConfig.Rank = ADC_RANK_NONE;
        HAL_ADC_ConfigChannel(&hadc, &sConfig);
    
        sConfig.Channel = channel;
        sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
        HAL_ADC_ConfigChannel(&hadc, &sConfig);
    
        HAL_ADC_Start(&hadc);
    
        if(HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK)
        {
            return HAL_ADC_GetValue(&hadc);
        }
    
        return 0;
    }
    
    
     uint16_t get_adc_av(uint32_t channel, uint8_t times)
    {
        uint32_t ad_sum=0;
        uint8_t i;
    
        for(i=0;i<times;i++)
        {
            ad_sum += get_adc(channel);
        }
    
        return ad_sum / times;
    }
    
    
    void get_map_x_y(float* x,float* y)
    {
        uint16_t x_adc;
        uint16_t y_adc;
        
        GPIO_InitTypeDef GPIO_InitStruct = {0};
    
        
    #if 0
        HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);
        GPIO_InitStruct.Pin = TWI_SCK_Pin|TWI_SDA_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    while(1){
    
        HAL_GPIO_WritePin(GPIOA, TWI_SCK_Pin, GPIO_PIN_SET);
    
        HAL_Delay_100us(3000);
    
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_SET);
    
        HAL_Delay_100us(3000);
    
        HAL_GPIO_WritePin(GPIOA, TWI_SCK_Pin, GPIO_PIN_RESET);
    
        HAL_Delay_100us(3000);
    
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_RESET);
        
        HAL_Delay_100us(3000);
    }
    
    #endif
    
        //X+ PP mode and set high, X- PP mode and set low     
        GPIO_InitStruct.Pin = XL_Pin|XR_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        HAL_GPIO_WritePin(GPIOA, XL_Pin, GPIO_PIN_SET);   //set X+ high
        HAL_GPIO_WritePin(GPIOA, XR_Pin, GPIO_PIN_RESET); //set X- low
    
        //Y+ adc mode,Y-float mode
        GPIO_InitStruct.Pin = YD_Pin;  //Y+
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      
        GPIO_InitStruct.Pin = YU_Pin;  //Y-
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        HAL_Delay_100us(5);
    
        y_adc = get_adc_av(ADC_CHANNEL_4, 10);
    
        *y = 3.3 * y_adc / 4096;
    
        GPIO_InitStruct.Pin = XL_Pin|XR_Pin|YD_Pin|YU_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        /* 将四个脚都拉低,目的是把四个脚连接的电容的电放掉 */
        HAL_GPIO_WritePin(GPIOA, XL_Pin, GPIO_PIN_RESET); //set X+ low
        HAL_GPIO_WritePin(GPIOA, XR_Pin, GPIO_PIN_RESET); //set X- low
        HAL_GPIO_WritePin(GPIOA, YD_Pin, GPIO_PIN_RESET); //set Y+ low
        HAL_GPIO_WritePin(GPIOA, YU_Pin, GPIO_PIN_RESET); //set Y- low
    
        //adc 采样后进行转换计算, 计算方法 点击四个角(现实坐标 )然后几下对应的adc输出值,算出直线方程adc_out=kx+b,就可以化出x=(adc_out-b)/k,y同理
        //*x=(x_orignal_data[1]-505)/240.4;
    
        //Y+ PP mode and set high, Y- PP mode and set low     
        GPIO_InitStruct.Pin = YD_Pin|YU_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        HAL_GPIO_WritePin(GPIOA, YD_Pin, GPIO_PIN_SET);   //set Y+ high
        HAL_GPIO_WritePin(GPIOA, YU_Pin, GPIO_PIN_RESET); //set Y- low
    
        //X+ adc mode,X-float mode
        GPIO_InitStruct.Pin = XL_Pin;  //X+
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      
        GPIO_InitStruct.Pin = XR_Pin;  //X-
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        HAL_Delay_100us(5);
    
        x_adc = get_adc_av(ADC_CHANNEL_0, 10);
    
        *x = 3.3 * x_adc / 4096;
    
        GPIO_InitStruct.Pin = XL_Pin|XR_Pin|YD_Pin|YU_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        /* 将四个脚都拉低,目的是把四个脚连接的电容的电放掉 */
        HAL_GPIO_WritePin(GPIOA, XL_Pin, GPIO_PIN_RESET); //set X+ low
        HAL_GPIO_WritePin(GPIOA, XR_Pin, GPIO_PIN_RESET); //set X- low
        HAL_GPIO_WritePin(GPIOA, YD_Pin, GPIO_PIN_RESET); //set Y+ low
        HAL_GPIO_WritePin(GPIOA, YU_Pin, GPIO_PIN_RESET); //set Y- low
    }
    
    #define RTP_IIC_ADDR 0x88
    
    #define SCK_READ() HAL_GPIO_ReadPin(GPIOA, TWI_SCK_Pin)
    #define SDA_READ() HAL_GPIO_ReadPin(GPIOA, TWI_SDA_Pin)
    
    typedef enum{
        STEP_IDLE = 0,
        STEP_START,
        STEP_DETECT_ADDR,
    
        STEP_READ_REG_NUM,
        
        STEP_SEND_DATA,
        STEP_READ_ACK,
        
        STEP_STOP,
        STEP_RESTART,
        STEP_READ_DATA,
        STEP_SEND_ACK,
        STEP_SEND_ACK_FINISHED,
    } iic_step_e;
    
    typedef enum{
        SDA_INT,
        SDA_OUT,
        SDA_IN,
    } sda_mode;
    
    typedef struct{
        uint8_t bit_cnt;
        uint8_t send_temp;
        uint8_t recv_temp;
        uint8_t reg_index;
        uint8_t iic_addr;
    
        uint8_t send_buffer[4];
        uint8_t recv_buffer[4];
        uint8_t buf0_chged;
        uint8_t buf1_chged;
        uint8_t buf2_chged;
        uint8_t buf3_chged;
        
        iic_step_e iic_send_or_read;
        iic_step_e iic_next_step;
        iic_step_e iic_step;
    } iic_s;
    
    
    iic_s iic = {0, 0, 0, STEP_IDLE};
    
    void set_sda_mode(sda_mode mode)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
    
        if(mode == SDA_INT){
            GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
        }else if(mode == SDA_OUT){
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        }else if(mode == SDA_IN){
            GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        }
        
        GPIO_InitStruct.Pin = TWI_SDA_Pin;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    
    void iic_send_ack(void)
    {
        set_sda_mode(SDA_OUT);
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_RESET);
    }
    
    void iic_wait_ack(void)
    {
        set_sda_mode(SDA_INT);
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_SET); //release sda
    }
    
    void iic_set_sda_high(void)
    {
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_SET);
    }
    
    void iic_set_sda_low(void)
    {
        HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_RESET);
    }
    
    void iic_set_sck_high(void)
    {
        HAL_GPIO_WritePin(GPIOA, TWI_SCK_Pin, GPIO_PIN_SET);
    }
    
    void iic_set_sck_low(void)
    {
        HAL_GPIO_WritePin(GPIOA, TWI_SCK_Pin, GPIO_PIN_RESET);
    }
    
    void iic_set_pb1_high(void)
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    }
    
    void iic_set_pb1_low(void)
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    }
    
    
    
    void iic_init()
    {
        iic.iic_step = STEP_IDLE;
        iic.iic_send_or_read = STEP_IDLE;
        iic.send_temp = 0;
        iic.recv_temp = 0;
        iic.bit_cnt = 0;
        iic.iic_addr = 0;
        iic.reg_index = 0;
        
        set_sda_mode(SDA_INT);
    }
    
    void iic_sda_process(void)
    {
        if(SCK_READ() == 0)
        {
            return;
        }
    
        if(SDA_READ() == 0)  //falling edge
        {
            iic_init();
            iic.iic_step = STEP_START;
        }
        else  //rising edge
        {
            iic.iic_step = STEP_STOP;
            set_sda_mode(SDA_INT);
        }
    }
    
    void iic_scl_falling_process(void)
    {
        switch(iic.iic_step)
        {
            case STEP_START:
                iic.iic_step = STEP_DETECT_ADDR;
                break;
                
            case STEP_SEND_ACK:
                set_sda_mode(SDA_OUT);
                HAL_GPIO_WritePin(GPIOA, TWI_SDA_Pin, GPIO_PIN_RESET);
                iic.iic_step = STEP_SEND_ACK;                             //next execute rising STEP_SEND_ACK
        
                break;
    
            case STEP_SEND_DATA:
                if(iic.bit_cnt >= 8){
                    iic.bit_cnt = 0;
                    iic.iic_step = STEP_READ_ACK;
                    set_sda_mode(SDA_INT);
                    break;
                }
                
                set_sda_mode(SDA_OUT);
                
                iic.send_temp = iic.send_buffer[iic.reg_index];
    
                if(iic.send_temp&(0x80>>iic.bit_cnt)){
                    iic_set_sda_high();
                }
                else{
                    iic_set_sda_low();
                }
    
                iic.bit_cnt++;
                
                break;
    
            case STEP_READ_REG_NUM:
                set_sda_mode(SDA_INT);
                break;
    
            case STEP_IDLE:
                iic_init();
                break;
                
        }
    }
    
    void iic_scl_rising_process(void)
    {
        switch(iic.iic_step){
            
            case STEP_DETECT_ADDR:
                
                iic_set_pb1_low();
        
                iic.iic_addr <<= 1;
                iic.iic_addr += SDA_READ();
            
                if(++iic.bit_cnt >= 8)
                {
                    iic.bit_cnt = 0;
                    
                    if((iic.iic_addr & 0xfe) == (RTP_IIC_ADDR & 0xfe)){
                        iic.iic_step = STEP_SEND_ACK;
                        iic.iic_next_step = STEP_READ_REG_NUM;
                    
                        if(iic.iic_addr & 0x01){                                        
                            iic.iic_send_or_read = STEP_SEND_DATA;             //master read,slave write
                        }
                        else{                                                  
                            iic.iic_send_or_read = STEP_READ_DATA;             //master write,slave read
                        }
                    }
                    else{
                        iic_init();
                    }
                }
                
                iic_set_pb1_high();
                
                break;
    
            case STEP_READ_REG_NUM:
                iic.reg_index <<= 1;
                iic.reg_index += SDA_READ();
                if(++iic.bit_cnt >= 8)
                {
                    iic.bit_cnt = 0;
                    iic.iic_step = STEP_SEND_ACK;
                    iic.iic_next_step = iic.iic_send_or_read;
                }
                break;
    
            case STEP_READ_DATA:
                set_sda_mode(SDA_INT);
                iic.recv_temp <<= 1;
                iic.recv_temp += SDA_READ();
                if(++iic.bit_cnt >= 8)
                {
                    iic.recv_buffer[iic.reg_index] = iic.recv_temp;
                    
                    switch(iic.reg_index){
                        case 0:iic.buf0_chged=1;break;
                        case 1:iic.buf1_chged=1;break;
                        case 2:iic.buf2_chged=1;break;
                        case 3:iic.buf3_chged=1;break;
                    }
                    
                    iic.bit_cnt = 0;
                    iic.iic_step = STEP_SEND_ACK;
                    iic.iic_next_step = STEP_IDLE;
                }
                break;
    
            case STEP_SEND_ACK:
                iic.iic_step = iic.iic_next_step;
                set_sda_mode(SDA_INT);
                break;
    
            case STEP_READ_ACK:
                if(!SDA_READ()){
                    iic_init();
                }else{
                    iic_init();
                }
                break;
    
            case STEP_IDLE:
                iic_init();
                break;
        }
    }
    
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == TWI_SCK_Pin)
        {
            if(SCK_READ()){
                iic_scl_rising_process();
            }else{
                iic_scl_falling_process();
            }
        }
        else if(GPIO_Pin == TWI_SDA_Pin)
        {
            iic_sda_process();
        }
    }
    
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    float x_v;
    float y_v;
    
    
    #if 1
    
    void IIC_Start(void)
    {
        set_sda_mode(SDA_OUT);
        iic_set_sda_high();            
        iic_set_sck_high();
        HAL_Delay_100us(1);
         iic_set_sda_low();
        HAL_Delay_100us(1);
        iic_set_sck_low();
    }      
    
    void IIC_Stop(void)
    {
        set_sda_mode(SDA_OUT);
        iic_set_sck_low();
        iic_set_sda_low();
         HAL_Delay_100us(1);
        iic_set_sck_high(); 
        iic_set_sda_high();
        HAL_Delay_100us(1);
        set_sda_mode(SDA_IN);  //jia
    }
    
    uint8_t IIC_Wait_Ack(void)
    {
        uint8_t ucErrTime=0;
            
        iic_set_sck_high();
        HAL_Delay_100us(1);
        
        while(SDA_READ())
        {
            ucErrTime++;
            if(ucErrTime>250)
            {
                IIC_Stop();
                return 1;
            }
        }
        iic_set_sck_low();       
        return 0;  
    } 
    //产生ACK应答
    void IIC_Ack(void)
    {
        set_sda_mode(SDA_OUT);
        iic_set_sck_low();
        iic_set_sda_low();
        HAL_Delay_100us(1);
        iic_set_sck_high(); 
        HAL_Delay_100us(1);
        iic_set_sck_low();
        set_sda_mode(SDA_IN);  //jia
    }
    //不产生ACK应答            
    void IIC_NAck(void)
    {
        set_sda_mode(SDA_OUT);
        iic_set_sck_low();
        iic_set_sda_high();
        HAL_Delay_100us(1);
        iic_set_sck_high(); 
        HAL_Delay_100us(1);
        iic_set_sck_low();
        set_sda_mode(SDA_IN);  //jia
    }                                          
    
    void IIC_Send_Byte(uint8_t txd)
    {                        
        uint8_t t;   
        set_sda_mode(SDA_OUT);         
        
        for(t=0;t<8;t++)
        {    
            iic_set_sck_low();
            if((txd&0x80)>>7)
                iic_set_sda_high();
            else
                iic_set_sda_low();
            txd<<=1; 
    
            HAL_Delay_100us(1);
            iic_set_sck_high();
            HAL_Delay_100us(1);
        }
        
        iic_set_sck_low();
        set_sda_mode(SDA_IN);
        HAL_Delay_100us(1);
    }         
    
    //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    uint8_t IIC_Read_Byte(unsigned char ack)
    {
        unsigned char i,receive=0;
        set_sda_mode(SDA_IN);     
        for(i=0;i<8;i++ )
        {
            iic_set_sck_low();     
            HAL_Delay_100us(1);
            iic_set_sck_high();
            receive<<=1;
            if(SDA_READ())receive++;   
            HAL_Delay_100us(1);
        }                     
        if (!ack)
            IIC_NAck();//发送nACK
        else
            IIC_Ack(); //发送ACK   
        return receive;
    }
    
    void iic_init_h()
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
    #if 1
        GPIO_InitStruct.Pin = TWI_SCK_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    #endif
    
    #if 1
        GPIO_InitStruct.Pin = TWI_SDA_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    #endif
    
        /* EXTI interrupt init*/
        HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);
    }
    
    #endif
    
    void delay_2p5us(){
        int i=7;
    
        while(i--);
    }
    
    void delay_5us(){
        int i=27;
    
        while(i--);
    }
    
    int main(void)
    {
        uint8_t rec_buf[5] = {0};
        
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_ADC_Init();
    
        iic.send_buffer[0] = 0xaa;
        iic.send_buffer[1] = 0xfe;
        iic.send_buffer[2] = 0x0e;
        iic.send_buffer[3] = 0x77;
    
    #if 0
        iic_init_h();
    
        set_sda_mode(SDA_OUT);
    
        while(1){
            iic_set_sda_low();     
            HAL_Delay_100us(1);
            iic_set_sda_high();
            HAL_Delay_100us(1);
        }
    #endif
    
    #if 0
    
        iic_init_h();
    
        while(1){
            iic_set_sck_low();
            delay_5us();
            iic_set_sck_high();
            delay_5us();
        }
    
    #if 0
    
        while(1){
            IIC_Start();
            IIC_Send_Byte(0x89);
            IIC_Wait_Ack();
            IIC_Send_Byte(1);
            IIC_Wait_Ack();
            rec_buf[0] = IIC_Read_Byte(1);
            IIC_Stop();
    #if 0
            IIC_Start();
            IIC_Send_Byte(0x89);
            IIC_Wait_Ack();
            IIC_Send_Byte(1);
            IIC_Wait_Ack();
            rec_buf[1] = IIC_Read_Byte(1);
            IIC_Stop();
    
            IIC_Start();
            IIC_Send_Byte(0x89);
            IIC_Wait_Ack();
            IIC_Send_Byte(2);
            IIC_Wait_Ack();
            rec_buf[2] = IIC_Read_Byte(1);
            IIC_Stop();
    
            IIC_Start();
            IIC_Send_Byte(0x89);
            IIC_Wait_Ack();
            IIC_Send_Byte(3);
            IIC_Wait_Ack();
            rec_buf[3] = IIC_Read_Byte(1);
            IIC_Stop();
    #endif
            
            //HAL_Delay_100us_d(2);
    /**********************************/
    #if 0
            IIC_Start();
            IIC_Send_Byte(0x88);
            IIC_Wait_Ack();
            IIC_Send_Byte(1);
            IIC_Wait_Ack();
            IIC_Send_Byte(0xaa);
            IIC_Wait_Ack();
            IIC_Stop();
    
            IIC_Start();
            IIC_Send_Byte(0x88);
            IIC_Wait_Ack();
            IIC_Send_Byte(1);
            IIC_Wait_Ack();
            IIC_Send_Byte(0xf0);
            IIC_Wait_Ack();
            IIC_Stop();
    
            IIC_Start();
            IIC_Send_Byte(0x88);
            IIC_Wait_Ack();
            IIC_Send_Byte(2);
            IIC_Wait_Ack();
            IIC_Send_Byte(0xee);
            IIC_Wait_Ack();
            IIC_Stop();
    
            IIC_Start();
            IIC_Send_Byte(0x88);
            IIC_Wait_Ack();
            IIC_Send_Byte(3);
            IIC_Wait_Ack();
            IIC_Send_Byte(0xbb);
            IIC_Wait_Ack();
            IIC_Stop();
    #endif
            
            rec_buf[4] = 0;
    
            HAL_Delay_100us_d(500);
        }
    #endif
    #endif
    
    #if 1
        while (1)
        {
            get_map_x_y(&x_v, &y_v);
        }
    #endif
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Configure the main internal regulator output voltage
      */
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
      RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB buses 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_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1)
      {
      }
      /* 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,
         ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/olivertian/p/14930329.html
Copyright © 2011-2022 走看看