You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.8 KiB
126 lines
3.8 KiB
#ifndef __BSP_I2C_SOFT_H
|
|
#define __BSP_I2C_SOFT_H
|
|
#include "stm32f4xx_hal.h"
|
|
#include "main.h"
|
|
// #include "sys.h"
|
|
|
|
// #define SCL_GPIO_PORT GPIOB
|
|
// #define SCL_PIN GPIO_PIN_6
|
|
// #define SDA_GPIO_PORT GPIOB
|
|
// #define SDA_PIN GPIO_PIN_7
|
|
|
|
|
|
typedef enum {
|
|
IIC_OK = 0x00, //IIC工作正常
|
|
IIC_WAIT_ACK_ERR = 0x01, //slave设备返回ACK错误
|
|
IIC_WRITE_ERR = 0x02, //向slave设备写入错误
|
|
IIC_READ_ERR = 0x04 //从slave设备读取错误
|
|
} IIC_STATUS;
|
|
|
|
typedef struct
|
|
{
|
|
GPIO_TypeDef *scl_port; //定义IIC时钟使用的端口
|
|
uint16_t scl_pin; //定义IIC时钟使用的PIN脚
|
|
GPIO_TypeDef *sda_port; //定义IIC数据使用的端口
|
|
uint16_t sda_pin; //定义IIC数据使用的PIN脚
|
|
uint8_t sda_pin_num; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
|
uint8_t addr; //器件地址
|
|
uint32_t delaytick; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
|
}IIC_SOFT_TypeDef;
|
|
|
|
//IO方向设置
|
|
#define SDA_IN() {SDA_GPIO_PORT->MODER&=~(3<<(7*2));SDA_GPIO_PORT->MODER|=0<<7*2;} //PB7输入模式
|
|
#define SDA_OUT() {SDA_GPIO_PORT->MODER&=~(3<<(7*2));SDA_GPIO_PORT->MODER|=1<<7*2;} //PB7输出模式
|
|
|
|
|
|
#define GPIO_WRITE_PIN(PORT,PIN,VALUE) HAL_GPIO_WritePin(PORT,PIN,(VALUE)?GPIO_PIN_SET:GPIO_PIN_RESET)
|
|
#define GPIO_READ_PIN(PORT,PIN) HAL_GPIO_ReadPin(PORT,PIN)
|
|
|
|
|
|
//IIC所有操作函数
|
|
// void IIC_Init( ); //初始化IIC的IO口
|
|
|
|
void IIC_Init(const IIC_SOFT_TypeDef *pSoftIIC); //初始化IIC的IO口
|
|
|
|
int IIC_READ_SDA_Pin(const IIC_SOFT_TypeDef *pSoftIIC);
|
|
int IIC_SDA_Mode_In(const IIC_SOFT_TypeDef *pSoftIIC);
|
|
int IIC_SDA_Mode_Out(const IIC_SOFT_TypeDef *pSoftIIC);
|
|
|
|
void IIC_Start(const IIC_SOFT_TypeDef *pSoftIIC); //发送IIC开始信号
|
|
void IIC_Stop(const IIC_SOFT_TypeDef *pSoftIIC); //发送IIC停止信号
|
|
void IIC_Send_Byte(const IIC_SOFT_TypeDef *pSoftIIC,uint8_t txd); //IIC发送一个字节
|
|
// uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
|
|
uint8_t IIC_Read_Byte( const IIC_SOFT_TypeDef *pSoftIIC);//IIC读取一个字节
|
|
uint8_t IIC_Wait_Ack(const IIC_SOFT_TypeDef *pSoftIIC); //IIC等待ACK信号
|
|
void IIC_Ack(const IIC_SOFT_TypeDef *pSoftIIC); //IIC发送ACK信号
|
|
void IIC_NAck(const IIC_SOFT_TypeDef *pSoftIIC); //IIC不发送ACK信号
|
|
|
|
|
|
uint8_t IIC_Read_Test(const IIC_SOFT_TypeDef *pSoftIIC, uint8_t reg_addr, uint8_t *buf, uint8_t len);
|
|
uint8_t IIC_Write_Test(const IIC_SOFT_TypeDef *pSoftIIC , uint8_t reg_addr, uint8_t *buf, uint8_t len);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
时序
|
|
// * @brief: I2C 开始,SCL为高电平的时候SDA产生一个下降沿信号
|
|
|
|
// _____
|
|
// *SDA \_____________
|
|
// * __________
|
|
// *SCL \________
|
|
//
|
|
|
|
|
|
// * @brief: I2C 停止,SCL为高电平的时候SDA产生一个上升沿信号
|
|
// _______
|
|
// *SDA __________/
|
|
// * ____________
|
|
// *SCL _____/
|
|
|
|
|
|
// * @brief: I2C 响应
|
|
// ____
|
|
// *SCL ______/ \______
|
|
// * ____ _____
|
|
// *SDA \_______/
|
|
//
|
|
|
|
// * @brief: I2C 不响应
|
|
|
|
// ____
|
|
// *SCL ______/ \______
|
|
// * __________________
|
|
// *SDA
|
|
//
|
|
|
|
|
|
HAL_I2C_MspDeInit( &hi2c1 );
|
|
uint8_t readout[256] = {0};
|
|
uint8_t writein[1] = {0xFB};
|
|
|
|
// IIC_Init( );
|
|
|
|
// IIC_Write_Test( 0xA0, 0, writein, 1 );
|
|
// HAL_Delay( 200 );
|
|
|
|
// IIC_Read_Test( 0xA0, 0, readout, 1 );
|
|
|
|
// log_i("iic test %02X .... ", *readout);
|
|
|
|
IIC_SOFT_TypeDef sIIC = {
|
|
GPIOB, GPIO_PIN_6, GPIOB, GPIO_PIN_7,
|
|
7,0xA0,1,
|
|
};
|
|
IIC_Init( &sIIC );
|
|
|
|
IIC_Write_Test( &sIIC,0xA0, 0, writein, 1 );
|
|
HAL_Delay( 200 );
|
|
|
|
IIC_Read_Test(&sIIC, 0xA0, 0, readout, 1 );
|
|
|
|
log_i("iic test %02X .... ", *readout);
|
|
|
|
*/ |