STM32 LL 庫 IIC參考


因為網上很少很少,只能在github上面擼了

https://github.com/Muxamor/KPL_SS2_CM2_TS/blob/898727c5d0349a13f00fb83af87b28195adf77d0/Src/i2c_cm.c

 

/*
 * i2c.c
 *
 *  Created on: Jul 10, 2018
 *      Author: muxamor
 */

#include "stm32l4xx.h"
#include "SetupPeriph.h"
#include "stm32l4xx_ll_i2c.h"
#include "i2c_cm.h"

#include  <stdio.h>


/**
  * @brief  Wriete register in TCA9554PWR
  * @param  I2C_TypeDef *I2Cx  -- Number port I2C
              SlaveAddr_IC - Address Slave IC on bus I2C
              addr_reg - Address registr TCA9554PWR
              value - value to write to registry
  * @retval An ErrorStatus enumeration
  *          - SUCCESS: 
  *          - ERROR:   Not applicable
  */

ErrorStatus I2C_write_reg_TCA9554(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg, uint8_t value){

    SlaveAddr_IC = SlaveAddr_IC<<1;

    uint32_t counter = 0;
    while(LL_I2C_IsActiveFlag_BUSY(I2Cx) == SET){
        counter++;
        if( counter == 25000 ) {//
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 2,LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE ); //LL_I2C_GENERATE_START_READ
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, addr_reg);

    counter=0;
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
        counter++;
        if( counter == 25000 ){
            LL_I2C_ClearFlag_TXE(I2Cx);
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_TransmitData8(I2Cx, value);
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);

    LL_I2C_ClearFlag_STOP(I2Cx);
    return SUCCESS;
}


ErrorStatus I2C_write_reg_8bit_TMP75(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg, uint8_t value){

    SlaveAddr_IC = SlaveAddr_IC<<1;

    uint32_t counter = 0;
    while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
        counter++;
        if( counter == 25000 ){//aproximate 150ms
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 2,LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE ); //LL_I2C_GENERATE_START_READ
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, addr_reg);

    counter=0;
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
        counter++;
        if( counter == 25000 ){//aproximate 150ms
            LL_I2C_ClearFlag_TXE(I2Cx);
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_TransmitData8(I2Cx, value);
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);

    LL_I2C_ClearFlag_STOP(I2Cx);
    return SUCCESS;
}


ErrorStatus I2C_write_reg_16bit_TMP75(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg, uint16_t value){

    SlaveAddr_IC = SlaveAddr_IC<<1;

    uint32_t counter = 0;
    while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
        counter++;
        if( counter == 25000 ){//aproximate 150ms
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 3,LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE ); //LL_I2C_GENERATE_START_READ
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, addr_reg);

    counter=0;
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
        counter++;
        if( counter == 25000){//aproximate 150ms
            LL_I2C_ClearFlag_TXE(I2Cx);
            Error_Handler();
            return ERROR;
        }
    }

    LL_I2C_TransmitData8(I2Cx, (uint8_t)(value>>8)); //byte1
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, (uint8_t) value ); //byte2
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);

    LL_I2C_ClearFlag_STOP(I2Cx);
    return SUCCESS;

}

uint8_t I2C_read_reg_8bit_TMP75(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg){

    uint8_t read_data;

    SlaveAddr_IC = SlaveAddr_IC<<1;

    uint32_t counter = 0;
    while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
        counter++;
        if( counter == 25000){//aproximate 150ms
            Error_Handler();
            return 0xFF;
        }
    }

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 1,LL_I2C_MODE_SOFTEND,LL_I2C_GENERATE_START_WRITE ); //LL_I2C_GENERATE_START_READ
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, addr_reg);

    counter=0;
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
        counter++;
        if( counter == 25000){//aproximate 150ms
            LL_I2C_ClearFlag_TXE(I2Cx);
            Error_Handler();
            return 0xFF;
        }
    }
    while(LL_I2C_IsActiveFlag_TC(I2Cx)==RESET);

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ); //LL_I2C_MODE_SOFTEND

    while(LL_I2C_IsActiveFlag_RXNE(I2Cx)==RESET);

    read_data = LL_I2C_ReceiveData8(I2Cx);

    while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);
    LL_I2C_ClearFlag_STOP(I2Cx);

    return read_data;
}

uint16_t I2C_read_reg_16bit_TMP75(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg){

    uint8_t read_data[2], i=0;

    SlaveAddr_IC = SlaveAddr_IC<<1;

    uint32_t counter = 0;
    while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
        counter++;
        if( counter == 25000 ){//aproximate 150ms
            Error_Handler();
            return 0xFF;
        }
    }

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 1,LL_I2C_MODE_SOFTEND,LL_I2C_GENERATE_START_WRITE ); //LL_I2C_GENERATE_START_READ
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);

    LL_I2C_TransmitData8(I2Cx, addr_reg);

    counter=0;
    while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
        counter++;
        if( counter == 25000 ){//aproximate 150ms
            LL_I2C_ClearFlag_TXE(I2Cx);
            Error_Handler();
            return 0xFF;
        }
    }
    while(LL_I2C_IsActiveFlag_TC(I2Cx)==RESET);

    LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC, LL_I2C_ADDRSLAVE_7BIT, 2, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ); //LL_I2C_MODE_SOFTEND

    while(!LL_I2C_IsActiveFlag_STOP(I2Cx)){

        if(LL_I2C_IsActiveFlag_RXNE(I2Cx)){
            read_data[i] = LL_I2C_ReceiveData8(I2Cx);
            i++;
        }
    }

    LL_I2C_ClearFlag_STOP(I2Cx);

    return (read_data[0]<<8) | read_data[1];
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM