Files
New_STC32G_All_Board/Source/iic_soft.c
2025-08-31 21:37:24 +08:00

134 lines
4.4 KiB
C

#include "iic_soft.h"
void soft_iic_delay(uint16 delay_time)
{
uint16 i;
// 简单的延时函数,可以根据实际需要调整
for (i = 0; i < delay_time; i++)
{
_nop_(); // 空操作,延时
}
}
void soft_iic_init(IIC_Soft_Config *config)
{
// 设置SCL和SDA引脚为推挽输出模式
gpio_mode(config->scl_pin, GPIO);
gpio_mode(config->sda_pin, GPIO);
// 初始化SCL和SDA引脚为高电平
gpio_set_level(config->scl_pin, 1);
gpio_set_level(config->sda_pin, 1);
}
void soft_iic_start(IIC_Soft_Config *config)
{
gpio_set_level(config->sda_pin, 0); // SDA拉低
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 0); // SCL拉低
soft_iic_delay(config->wait_time); // 等待一段时间
}
void soft_iic_stop(IIC_Soft_Config *config)
{
gpio_set_level(config->sda_pin, 0); // SDA拉低
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 1); // SCL拉高
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->sda_pin, 1); // SDA拉高
soft_iic_delay(config->wait_time); // 等待一段时间
}
uint8 soft_iic_read(IIC_Soft_Config *config)
{
uint8 dat = 0,i;
gpio_set_level(config->sda_pin, 1); // 设置SDA为输入模式
for (i = 0; i < 8; i++)
{
gpio_set_level(config->scl_pin, 1); // SCL拉高
soft_iic_delay(config->wait_time); // 等待一段时间
if (gpio_get_level(config->sda_pin)) // 读取SDA的状态
{
dat |= (1 << (7 - i)); // 将读取的位存入dat
}
gpio_set_level(config->scl_pin, 0); // SCL拉低
soft_iic_delay(config->wait_time); // 等待一段时间
}
return dat;
}
void soft_iic_write(IIC_Soft_Config *config, uint8 dat)
{
uint8 i;
gpio_set_level(config->sda_pin, 0); // 设置SDA为输出模式
for (i = 0; i < 8; i++)
{
soft_iic_delay(config->wait_time); // 等待一段时间
if (dat & (1 << (7 - i))) // 检查当前位
{
gpio_set_level(config->sda_pin, 1); // 写入1
}
else
{
gpio_set_level(config->sda_pin, 0); // 写入0
}
gpio_set_level(config->scl_pin, 1); // SCL拉高
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 0); // SCL拉低
}
soft_iic_delay(config->wait_time); // 等待一段时间
}
uint8 soft_iic_ack(IIC_Soft_Config *config)
{
gpio_set_level(config->sda_pin, 0); // 发送ACK
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 1); // SCL拉高
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 0); // SCL拉低
soft_iic_delay(config->wait_time); // 等待一段时间
return 0; // 返回ACK成功
}
void soft_iic_nack(IIC_Soft_Config *config)
{
gpio_set_level(config->sda_pin, 1); // 发送NACK
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 1); // SCL拉高
soft_iic_delay(config->wait_time); // 等待一段时间
gpio_set_level(config->scl_pin, 0); // SCL拉低
soft_iic_delay(config->wait_time); // 等待一段时间
}
void soft_iic_write_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 dat)
{
soft_iic_start(config); // 发送起始信号
soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令
soft_iic_ack(config); // 等待ACK
soft_iic_write(config, reg); // 发送寄存器地址
soft_iic_ack(config); // 等待ACK
soft_iic_write(config, dat); // 发送数据
soft_iic_ack(config); // 等待ACK
soft_iic_stop(config); // 发送停止信号
}
uint8 soft_iic_read_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 *dat)
{
soft_iic_start(config); // 发送起始信号
soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令
soft_iic_ack(config); // 等待ACK
soft_iic_write(config, reg); // 发送寄存器地址
soft_iic_ack(config); // 等待ACK
soft_iic_start(config); // 重新发送起始信号
soft_iic_write(config, (dev_addr << 1) | 1); // 发送设备地址和读命令
soft_iic_ack(config); // 等待ACK
*dat = soft_iic_read(config); // 读取数据
soft_iic_nack(config); // 发送NACK
soft_iic_stop(config); // 发送停止信号
return *dat; // 返回读取的数据
}