This repository has been archived on 2024-05-05. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ABS-Peripheral-Drive/通讯协议/软件IIC/AbsSoftIIC.c
2023-10-17 21:44:23 +08:00

244 lines
4.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
@文件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