stm32cubemx实现模拟IIC https://blog.csdn.net/qq_45467083/article/details/109433847
上面的代码只是iic的基础功能,这里增加了对一些地址读写寄存器的函数封装。
#ifndef __IOI2C_H
#define __IOI2C_H
#include "main.h"
typedef uint8_t u8;
typedef uint32_t u32;
#define SDA_GROUP GPIOB
#define SDA_PIN GPIO_PIN_9
#define SCL_GROUP GPIOB
#define SCL_PIN GPIO_PIN_8
//IO方向设置
#define SDA_IN() my_SDA_IN()
#define SDA_OUT() my_SDA_OUT()
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
u8 IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
//扩展IIC操作
unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr);
unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data);
u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data);
u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data);
u8 IICwriteBit(u8 dev,u8 reg,u8 bitNum,u8 data);
u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data);
int i2cWrite(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *data);
int i2cRead(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf);
#endif
#include "IOI2C.h"
#include <stdio.h>
void delay_us(u32 us){
u32 i = 0;
for(i=0;i<us;i++){
u8 a = 10;
while(a--);
}
}
void my_SDA_IN(void){
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SDA_GROUP, &GPIO_InitStruct);
}
void my_SDA_OUT(void){
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SDA_GROUP, &GPIO_InitStruct);
}
void my_IIC_SCL(GPIO_PinState val){
HAL_GPIO_WritePin(SCL_GROUP,SCL_PIN,val);
}