This commit is contained in:
2023-10-17 21:44:23 +08:00
parent 30b569f3d6
commit b85fc4bdf1
14 changed files with 1401 additions and 281 deletions

View File

@@ -0,0 +1,244 @@
/*
@文件AbsSoftIIC.c
@作者:你遇了我
@联系321640253@qq.com
@描述软件IIC
@版本v0.1.2
*/
#include "AbsSoftIIC.h"
#if(ABS_SOFT_IIC_ON)
/**************************抽象实现区(BEGIN)********************************/
/*
实现SDA引脚改变为输入模式
*/
void ABS_IIC_SDA_MODE_INPUT(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*
实现SDA引脚改变为输出模式
*/
void ABS_IIC_SDA_MODE_OUTPUT(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/**************************抽象实现区(END)**********************************/
/*简易延时*/
static void ABS_IIC_delay(uint16_t T){
while(T--);
}
/*起始信号*/
void ABS_I2C_Start(void)
{
ABS_IIC_SDA_Set();
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SDA_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
}
/*结束信号*/
void ABS_I2C_Stop(void)
{
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_Reset();
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SDA_Set();
}
/*等待应答信号*/
ABS_SOFT_IIC_STATE ABS_I2C_WaitAck(void)
{
ABS_IIC_SDA_Set();
uint16_t timeout = 0;
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SDA_MODE_INPUT();
ABS_IIC_SCL_Set();
while(ABS_IIC_SDA_READ()){
ABS_IIC_delay(1);
timeout++;
if(timeout>ABS_IIC_Wait_OUTTime){
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_MODE_OUTPUT();
return ABS_SOFT_IIC_TIMEOUT;
}
}
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_MODE_OUTPUT();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
return ABS_SOFT_IIC_SUCCESS;
}
void ABS_I2C_Ack(void)
{
ABS_IIC_SDA_MODE_OUTPUT();
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
}
void ABS_I2C_NAck(void)
{
ABS_IIC_SDA_MODE_OUTPUT();
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
}
/*发送一个字节*/
static void ABS_IIC_Send_Byte(uint8_t dat)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
ABS_IIC_SDA_Set();
}
else
{
ABS_IIC_SDA_Reset();
}
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
ABS_IIC_SCL_Reset();
dat<<=1;
}
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
}
void ABS_I2C_Read_Byte(uint8_t address,uint8_t *dat)
{
uint8_t i;
ABS_IIC_SCL_Reset();
ABS_IIC_SDA_Reset();
ABS_IIC_SDA_MODE_INPUT();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
for(i=0;i<8;i++)
{
ABS_IIC_SCL_Set();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
if(ABS_IIC_SDA_READ())
{
*dat|=(0x1<<(7-i));
}
else
{
*dat&=~(0x1<<(7-i));
}
ABS_IIC_SCL_Reset();
ABS_IIC_delay(ABS_IIC_DELAY_TIME);
}
}
ABS_SOFT_IIC_STATE ABS_I2C_WR_Byte(uint8_t address,uint8_t dat){
ABS_IIC_SCL_Set();
ABS_IIC_SDA_Set();
ABS_I2C_Start();
ABS_IIC_Send_Byte(address);
if(ABS_I2C_WaitAck()==ABS_SOFT_IIC_SUCCESS);
else {
ABS_I2C_Stop();
return ABS_SOFT_IIC_ERROR;
}
ABS_IIC_Send_Byte(dat);
ABS_I2C_WaitAck();
ABS_I2C_Stop();
return ABS_SOFT_IIC_SUCCESS;
}
/*
*@函数:ABS_I2C_WR_Bytes
*@功能:向指定的器件地址写入num个字节数据
*@参数: address:器件地址
*dat:需要写入数据的指针
num:数据的长度(不包括器件地址)
*/
ABS_SOFT_IIC_STATE ABS_I2C_WR_Bytes(uint8_t address,uint8_t *dat,uint8_t num){
ABS_IIC_SCL_Set();
ABS_IIC_SDA_Set();
ABS_I2C_Start();
ABS_IIC_Send_Byte(address);
if(ABS_I2C_WaitAck()==ABS_SOFT_IIC_SUCCESS);
else {
ABS_I2C_Stop();
return ABS_SOFT_IIC_ERROR;
}
while(num--)
{
ABS_IIC_Send_Byte(*dat);
ABS_I2C_WaitAck();
dat++;
}
ABS_I2C_Stop();
return ABS_SOFT_IIC_SUCCESS;
}
ABS_SOFT_IIC_STATE ABS_I2C_RD_Byte(uint8_t address,uint8_t *dat){
ABS_IIC_SCL_Set();
ABS_IIC_SDA_Set();
ABS_I2C_Start();
ABS_IIC_Send_Byte(address);
if(ABS_I2C_WaitAck()==ABS_SOFT_IIC_SUCCESS);
else {
ABS_I2C_Stop();
return ABS_SOFT_IIC_ERROR;
}
ABS_I2C_Read_Byte(address,dat);
ABS_I2C_Stop();
return ABS_SOFT_IIC_SUCCESS;
}
ABS_SOFT_IIC_STATE ABS_I2C_RD_Bytes(uint8_t address,uint8_t *dat,uint8_t num){
ABS_IIC_SCL_Set();
ABS_IIC_SDA_Set();
ABS_I2C_Start();
ABS_IIC_Send_Byte(address);
if(ABS_I2C_WaitAck()==ABS_SOFT_IIC_SUCCESS);
else {
ABS_I2C_Stop();
return ABS_SOFT_IIC_ERROR;
}
while(num--)
{
ABS_I2C_Read_Byte(address,dat);
if(num==0)ABS_I2C_NAck();
else ABS_I2C_Ack();
dat++;
}
ABS_I2C_Stop();
return ABS_SOFT_IIC_SUCCESS;
}
#endif

View File

@@ -0,0 +1,52 @@
/*
@文件AbsSoftIIC.h
@作者:你遇了我
@联系321640253@qq.com
@描述软件IIC,请在配置区按照自己的情况改动
@版本v0.1.2
*/
#ifndef _ABS_SOFT_I2C_H_
#define _ABS_SOFT_I2C_H_
#include <stdint.h>
#include <stdbool.h>
#define ABS_SOFT_IIC_ON 0 //启动整个软件IIC
#if(ABS_SOFT_IIC_ON)
/****************************配置区(BEGIN)****************************************/
/*------导入你需要的头文件(BEGIN)------*/
#include "main.h"
/*------导入你需要的头文件(END)--------*/
#define ABS_IIC_DELAY_TIME 10
#define ABS_IIC_Wait_OUTTime 2000
/*1、按选择自己的需求定义SDA线和SCL线的函数建议用推挽输出*/
#define ABS_IIC_SDA_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET) //定义你的SDA引脚设置高电平函数
#define ABS_IIC_SDA_Reset() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET) //定义你的SDA引脚设置低电平函数
#define ABS_IIC_SCL_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET) //定义你的SCL引脚设置高电平函数
#define ABS_IIC_SCL_Reset() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET) //定义你的SCL引脚设置低电平函数
#define ABS_IIC_SDA_READ() HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)
/*2、到抽象实现区实现SDA引脚的输入输出模式的改变函数*/
/****************************配置区(END)******************************************/
typedef enum _ABS_sotfiic_state{
ABS_IIC_STATE_ACK = 0U,
ABS_IIC_STATE_NACK = 1U,
ABS_SOFT_IIC_TIMEOUT = 2U,
ABS_SOFT_IIC_SUCCESS = 3U,
ABS_SOFT_IIC_ERROR = 4U,
} ABS_SOFT_IIC_STATE;
/****************************函数声明区(BEGIN)************************************/
ABS_SOFT_IIC_STATE ABS_I2C_WR_Byte(uint8_t address,uint8_t dat); //发送一个字节数据
ABS_SOFT_IIC_STATE ABS_I2C_WR_Bytes(uint8_t address,uint8_t *dat,uint8_t num); //发送多个字节数据
ABS_SOFT_IIC_STATE ABS_I2C_RD_Bytes(uint8_t address,uint8_t *dat,uint8_t num);
/****************************函数声明区(END)**************************************/
#endif //ABS_SOFT_IIC_ONL
#endif

View File