更新
This commit is contained in:
244
通讯协议/软件IIC/AbsSoftIIC.c
Normal file
244
通讯协议/软件IIC/AbsSoftIIC.c
Normal 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
|
||||
52
通讯协议/软件IIC/AbsSoftIIC.h
Normal file
52
通讯协议/软件IIC/AbsSoftIIC.h
Normal 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
|
||||
0
通讯协议/软件IIC/README.md
Normal file
0
通讯协议/软件IIC/README.md
Normal file
Reference in New Issue
Block a user