当前位置:网站首页>Software I2C based on Hal Library
Software I2C based on Hal Library
2022-07-06 11:22:00 【Clear glass, brilliant orange】

I2C Transmission timing
#include <stdio.h>
#include "main.h"
#include "driver_i2c.h"
#include "driver_timer.h"
#include "driver_usart.h"
#define I2C_Delay() us_timer_delay(5) // Clock Pulse Width >5us
/* * Function name :void I2C_Init(void) * Input parameters : * Output parameters : nothing * Return value : nothing * Function function : Initialize simulation I2C The pin of is in the output state and SCL/SDA Are initially high level */
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
SCL_PIN_CLK_EN(); /* __HAL_RCC_GPIOB_CLK_ENABLE() */
SDA_PIN_CLK_EN(); /* __HAL_RCC_GPIOB_CLK_ENABLE() */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = SCL_PIN; /* SCL_PIN by GPIO_PIN_6 */
HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SDA_PIN; /* SDA_PIN by GPIO_PIN_7 */
HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
SCL_H(); /* Set up SCL_PIN High level HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET) */
SDA_H(); /* Set up SDA_PIN High level HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET) */
}
/*
- Function name :static void I2C_SDA_OUT(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function : To configure SDA Pin is output
*/
static void I2C_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = SDA_PIN;
HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}
/*
- Function name :static void I2C_SDA_IN(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function : To configure SDA Pin is input
*/
static void I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = SDA_PIN;
HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}
/*
- Function name :void I2C_Start(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Start signal
*/
void I2C_Start(void)
{
I2C_SDA_OUT();
SCL_H(); /* Pull up the clock line HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET) */
I2C_Delay();
SDA_H();
I2C_Delay();
SDA_L();
I2C_Delay();
SCL_L();
I2C_Delay();
}
/*
- Function name :void I2C_Stop(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Stop signal
*/
void I2C_Stop(void)
{
I2C_SDA_OUT();
SDA_L();
I2C_Delay();
SCL_H();
I2C_Delay();
SDA_H();
I2C_Delay();
}

/*
- Function name :void I2C_ACK(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a reply signal
*/
void I2C_ACK(void)
{
I2C_SDA_OUT(); /* Set up SDA For export */
SCL_L();
I2C_Delay();
SDA_L();
I2C_Delay();
SCL_H(); /* Pull the clock cable high , Generate rising edge data transmission */
I2C_Delay();
SCL_L();
I2C_Delay();
}
/*
- Function name :void I2C_NACK(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a non reply signal
*/
void I2C_NACK(void)
{
I2C_SDA_OUT();
SCL_L();
I2C_Delay();
SDA_H();
I2C_Delay();
SCL_H();
I2C_Delay();
SCL_L();
I2C_Delay();
}
/*
- Function name :uint8_t I2C_GetACK(void)
- Input parameters :
- Output parameters : nothing
- Return value :1 No response ,0 There's a response
- Function function :I2C Wait for the response signal from the slave
*/
uint8_t I2C_GetACK(void)
{
uint8_t time = 0;
I2C_SDA_IN();
SCL_L();
I2C_Delay();
SDA_H();
I2C_Delay();
SCL_H();
I2C_Delay();
while(SDA_INPUT())
{
time++;
if(time>250)
{
SCL_L();
return 1;
}
}
SCL_L();
return 0;
}
/*
- Function name :void I2C_SendByte(uint8_t data)
- Input parameters :data-> Data sent
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a byte
*/
void I2C_SendByte(uint8_t data)
{
uint8_t cnt = 0;
I2C_SDA_OUT();
for(cnt=0; cnt<8; cnt++)
{
SCL_L();
I2C_Delay();
if(data & 0x80)
{
SDA_H();
}
else
{
SDA_L();
}
data = data<<1;
SCL_H();
I2C_Delay();
}
SCL_L();
I2C_Delay();
I2C_GetACK();
}
/*
- Function name :uint8_t I2C_ReadByte(uint8_t ack)
- Input parameters :ack-> Sent reply flag ,1 The reply ,0 Non response
- Output parameters : nothing
- Return value : Return the read bytes
- Function function :I2C Read a byte
*/
uint8_t I2C_ReadByte(uint8_t ack)
{
uint8_t cnt;
uint8_t data = 0xFF;
SCL_L();
I2C_Delay();
for(cnt=0; cnt<8; cnt++)
{
SCL_H(); //SCL high ( Reading data )
I2C_Delay();
data <<= 1;
if(SDA_INPUT())
{
data |= 0x01; //SDA high ( The data is 1)
}
SCL_L();
I2C_Delay();
}
// Send reply signal , Answer for low , High representative non response
if(ack == 0)
{
I2C_ACK();
}
else
{
I2C_NACK();
}
return data; // Return the data
}
i2c.h file
#ifndef __DRIVER_I2C_H
#define __DRIVER_I2C_H
#include "stm32f1xx_hal.h"
/************************* I2C Hardware related definitions *************************/
#define ACK (0)
#define NACK (1)
#define SCL_PIN GPIO_PIN_6
#define SCL_PORT GPIOB
#define SCL_PIN_CLK_EN() __HAL_RCC_GPIOB_CLK_ENABLE()
#define SDA_PIN GPIO_PIN_7
#define SDA_PORT GPIOB
#define SDA_PIN_CLK_EN() __HAL_RCC_GPIOB_CLK_ENABLE()
#define SCL_H() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET)
#define SCL_L() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_RESET)
#define SCL_INPUT() HAL_GPIO_ReadPin(SCL_PORT, SCL_PIN)
#define SDA_H() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET)
#define SDA_L() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_RESET)
#define SDA_INPUT() HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN)
/************************* I2C End of hardware related definitions ************************/
/
- Function name :void I2C_Init(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function : Initialize simulation I2C The pin of is in the output state and SCL/SDA Are initially high level
*/
extern void I2C_Init(void);
/*
- Function name :void I2C_Start(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Start signal
*/
extern void I2C_Start(void);
/*
- Function name :void I2C_Stop(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Stop signal
*/
extern void I2C_Stop(void);
/*
- Function name :void I2C_ACK(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a reply signal
*/
extern void I2C_ACK(void);
/*
- Function name :void I2C_NACK(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a non reply signal
*/
extern void I2C_NACK(void);
/*
- Function name :uint8_t I2C_GetACK(void)
- Input parameters :
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Wait for the response signal from the slave
*/
extern uint8_t I2C_GetACK(void);
/*
- Function name :void I2C_SendByte(uint8_t data)
- Input parameters :data-> Data sent
- Output parameters : nothing
- Return value : nothing
- Function function :I2C Send a byte
*/
extern void I2C_SendByte(uint8_t data);
/*
- Function name :uint8_t I2C_ReadByte(uint8_t ack)
- Input parameters :ack-> Sent reply flag ,1 The reply ,0 Non response
- Output parameters : nothing
- Return value : Return the read bytes
- Function function :I2C Read a byte
*/
extern uint8_t I2C_ReadByte(uint8_t ack);
#endif
边栏推荐
- Summary of numpy installation problems
- Antlr4 uses keywords as identifiers
- Install mongdb tutorial and redis tutorial under Windows
- Swagger, Yapi interface management service_ SE
- Tcp/ip protocol (UDP)
- 天梯赛练习集题解LV1(all)
- Django running error: error loading mysqldb module solution
- QT creator test
- Julia 1.6 1.7 common problem solving
- Armv8-a programming guide MMU (2)
猜你喜欢
![[recommended by bloggers] C # generate a good-looking QR code (with source code)](/img/5a/1dbafe5a28f016b815964b9b37c9f1.jpg)
[recommended by bloggers] C # generate a good-looking QR code (with source code)

软件测试与质量学习笔记3--白盒测试

打开浏览器的同时会在主页外同时打开芒果TV,抖音等网站

Summary of numpy installation problems

02-项目实战之后台员工信息管理

Windows cannot start the MySQL service (located on the local computer) error 1067 the process terminated unexpectedly

Learning question 1:127.0.0.1 refused our visit

AcWing 242. A simple integer problem (tree array + difference)

Request object and response object analysis
![[number theory] divisor](/img/ec/036d7e76cc566c08d336444f2898e1.jpg)
[number theory] divisor
随机推荐
SSM整合笔记通俗易懂版
Learn winpwn (2) -- GS protection from scratch
连接MySQL数据库出现错误:2059 - authentication plugin ‘caching_sha2_password‘的解决方法
Ansible实战系列一 _ 入门
[蓝桥杯2017初赛]方格分割
AcWing 1294. Cherry Blossom explanation
FRP intranet penetration
JDBC原理
QT creator specifies dependencies
Image recognition - pyteseract TesseractNotFoundError: tesseract is not installed or it‘s not in your path
neo4j安装教程
AI benchmark V5 ranking
Learning question 1:127.0.0.1 refused our visit
L2-007 家庭房产 (25 分)
Ansible实战系列二 _ Playbook入门
Pytorch基础
Database advanced learning notes -- SQL statement
02-项目实战之后台员工信息管理
[蓝桥杯2021初赛] 砝码称重
MySQL的一些随笔记录