STM32のビットバングI2C

書式#include <stdio.hに>
する#include <stdlib.h>に含ま
の#include "stm32l0xx_hal.h"

/ ** I2C1 GPIO設定    
    PB6 ------> I2C1_SCL
    PB7 ------> I2C1_SDA
* /

の#define SCL_0 HAL_GPIO_WritePin(GPIOB、GPIO_PIN_6、GPIO_PIN_RESET)
の#define SCL_1 HAL_GPIO_WritePin(GPIOB、GPIO_PIN_6、GPIO_PIN_SET)
の#define SDA_0 HAL_GPIO_WritePin(GPIOB、GPIO_PIN_7、GPIO_PIN_RESET)
の#define SDA_1 HAL_GPIO_WritePin(GPIOB、GPIO_PIN_7、GPIO_PIN_SET)
の#define IICport GPIOB
の#define SCL GPIO_PIN_6
# SDA GPIO_PIN_7定義する

静的な無効I2C_START(ボイド);
静的な無効i2c_stop(無効)。
静的な無効wait_ack(無効)。
静的ボイドi2c_writebyte(unsigned char型のA)。
静的unsigned char型のi2c_readbyte(無効)。
静的な無効SDAIN(無効)。
静的な無効SDAOUT(無効)。
静的な無効sendack(無効)。
静的な無効sendnack(無効)。
静的ボイドi2c_writebit(unsigned char型のA)。

空i2c1_sw_acc_init(無効)。
ボイドi2c1_sw_acc_write(unsigned char型SADD、unsigned charのREG、unsigned char型のVal);
unsigned char型のi2c1_sw_acc_read(SADD unsigned char型、unsigned char型のREG)。

/ **
* I2CバスにACK信号を送信@brief
* /
静的ボイドsendackを(ボイド)
{
    i2c_writebit(0)。
}
/ **
* @brief I2CバスでNACK信号を送信します
* /
静的ボイドsendnack(ボイド)
{
    i2c_writebit(1)。
}

/ **
* @brief realese SDA
* /
静的ボイドSDAIN(ボイド)
{
    GPIO_InitTypeDef GPIO_InitStructure。

    GPIO_InitStructure.Pin = GPIO_PIN_7。
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT。    
    HAL_GPIO_Init(GPIOB、&GPIO_InitStructure)。
}

/ **
* @brief GET SDAの制御は、
* /
静的ボイドSDAOUT(ボイド)
{
    GPIO_InitTypeDef GPIO_InitStructure。

    GPIO_InitStructure.Pin = GPIO_PIN_7。
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD。
    HAL_GPIO_Init(GPIOB、&GPIO_InitStructure)。
}

/ **
*遅延@brief
* /
静的ボイドdelay5us(ボイド)
{
    unsigned short型I。
    I = 50;
    
    一方、(i--)。
}

/ **
I2Cバスで* @brief送信開始信号
* /
静的ボイドI2C_START(ボイド)
{
    SDAOUT()。  
    SDA_1;
    delay5us();
    SCL_1;
    delay5us();
    SDA_0;
    delay5us();
    SCL_0;
    delay5us();
}

/ **
* @brief送信停止信号I2Cバスで
* /
静的ボイドi2c_stop(ボイド)
{
    SDAOUT()。
    SDA_0;
    delay5us();
    SCL_1;
    delay5us();
    SDA_1;
    delay5us();
    SCL_0;
    delay5us();
}
/ **
* @briefレシーブACK I2Cバスに信号
* /
静的ボイドwait_ack(ボイド)
{  
    I INT。    

    SCL_0;
    delay5us;
    SDAIN();
    delay5us;
    SCL_1;
    delay5us();
    一方、(HAL_GPIO_ReadPin(IICport、SDA)&&(I <0x2b0)){
        I ++。
    }
    
    SCL_0。
    delay5us();
}

/ **
* I2Cバスでバイトを書き込み@brief
*
書き込みに* @paramデータ
* /
静的ボイドi2c_writebyte(unsigned char型のA)
{
    unsigned short型I。
    
    SDAOUT();
    以下のための(I = 0、I <8; I ++){
        SCL_0。
        delay5us();
        IF(&は0x80){
            SDA_1。
        {}他
            SDA_0。
        }
        = << 1。
        delay5us();
        SCL_1;
        delay5us();
    }
}
/ **
* I2Cバスにビットを書き込む@brief
*
ライトに* @paramデータ
* /
静的ボイドi2c_writebit(unsigned char型のA)
{
    SDAOUT()。
    SCL_0;
    delay5us();
    IF(== 0){
        SDA_0;
    {}他
        SDA_1。
    }
    delay5us()。
    SCL_1;
    delay5us();
    SCL_0;
    delay5us();
}


/ **
* I2Cバスのバイトを読み取る@brief
*
* @retvalデータ読み出し
* /
静的unsigned char型のi2c_readbyte()
{
    unsigned char型I、TEMP。
    温度= 0;
    
    SDAIN();
    SCL_0;      
    delay5us();
    以下のための(I = 0、I <8; I ++){
        SCL_1。  
        delay5us();
        TEMP =(一時<< 1)| HAL_GPIO_ReadPin(IICport、SDA);
        delay5us();
        SCL_0;  
        delay5us();
    }
    TEMPを返します。
}

/ **
* I2C関連のGPIO初期@brief
* /
ボイドi2c1_sw_acc_init(ボイド)
{       
    GPIO_InitTypeDef GPIO_InitStructureと、

    __GPIOB_CLK_ENABLE()。
    GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7。
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD。
    GPIO_InitStructure.Pull = GPIO_NOPULL。
    GPIO_InitStructure.Speed = GPIO_SPEED_FAST。// GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOB、&GPIO_InitStructure)。

    SDA_1;
    SCL_1;
}

/ **
* MPU6050上の特定のアドレスに書き込みデータ@brief
*
* @paramデータのチップ内アドレスを追加
* @param ACHAR書き込むためのデータ
* /
ボイドi2c1_sw_acc_write(unsigned char型SADD、unsigned charのREG、unsigned char型のval)
{
    I2C_START()。
    i2c_writebyte(SADD)。
    wait_ack();
    i2c_writebyte(REG)。
    wait_ack();
    i2c_writebyte(ヴァル)。
    wait_ack();
    i2c_stop();
}
/ **
* MPU6050の特定のアドレスからデータを読み出す@brief
*
* @paramは、データのチップ内アドレスを追加
データが読み出さ@retval *
* /
unsigned char型のi2c1_sw_acc_readを(unsigned char型はunsigned char型のREG、SADD)
{
    unsigned char型を一時;
    
    I2C_START();
    i2c_writebyte(SADD)。
    wait_ack();
    delay5us();
    i2c_writebyte(REG)。
    wait_ack();
    I2C_START();
    i2c_writebyte(SADD + 1)。
    wait_ack();
    TEMP = i2c_readbyte()。
    sendnack();
    i2c_stop();
    
    温度を返します。
}

公開された124元の記事 ウォン称賛51 ビュー320 000 +

おすすめ

転載: blog.csdn.net/zoosenpin/article/details/73321178