書式#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();
温度を返します。
}
STM32のビットバングI2C
おすすめ
転載: blog.csdn.net/zoosenpin/article/details/73321178
ランキング