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.
56 lines
1.8 KiB
56 lines
1.8 KiB
#ifndef BSP_I2C_H
|
|
|
|
#define BSP_I2C_H
|
|
|
|
#include "bsp_config.h"
|
|
#ifdef USE_I2C
|
|
#include "main.h"
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
//IO方向设置
|
|
// 请根据实际引脚修改 PIN_NUMBER
|
|
#define SDA_PIN_NUM 5
|
|
|
|
// 计算掩码和偏移
|
|
#define SDA_MODER_MASK (~(0x03U << (SDA_PIN_NUM * 2)))
|
|
#define SDA_MODER_INPUT_VAL (0x00U << (SDA_PIN_NUM * 2))
|
|
#define SDA_MODER_OUTPUT_VAL (0x01U << (SDA_PIN_NUM * 2))
|
|
|
|
// 配置为输入 (MODER = 00)
|
|
#define SDA_IN() do { \
|
|
GPIOB->MODER &= SDA_MODER_MASK; \
|
|
GPIOB->MODER |= SDA_MODER_INPUT_VAL; \
|
|
} while(0)
|
|
|
|
// 配置为输出 (MODER = 01) - I2C 通常需要开漏,还需要配置 OTYPER
|
|
#define SDA_OUT() do { \
|
|
GPIOB->MODER &= SDA_MODER_MASK; \
|
|
GPIOB->MODER |= SDA_MODER_OUTPUT_VAL; \
|
|
GPIOB->OTYPER |= (1U << SDA_PIN_NUM); /* 设置为开漏 Output Open Drain */ \
|
|
} while(0)
|
|
|
|
//IO操作
|
|
#define IIC_SCL(sta) HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, sta) //SCL
|
|
#define IIC_SDA(sta) HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, sta) //SDA
|
|
#define READ_SDA HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin) //输入SDA
|
|
|
|
#define PCF8591 0x90
|
|
|
|
extern uint8_t D[4];
|
|
//IIC所有操作函数
|
|
void IIC_Init(void); //初始化IIC的IO口
|
|
void IIC_Start(void); //发送IIC开始信号
|
|
void IIC_Stop(void); //发送IIC停止信号
|
|
void IIC_Send_Byte(uint8_t txd); //IIC发送一个字节
|
|
uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
|
|
uint8_t IIC_Wait_Ack(void); //IIC等待ACK信号
|
|
void IIC_Ack(void); //IIC发送ACK信号
|
|
void IIC_NAck(void); //IIC不发送ACK信号
|
|
|
|
void IIC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
|
|
uint8_t IIC_Read_One_Byte(uint8_t daddr,uint8_t addr);
|
|
void IIC_TEST(void);
|
|
#endif
|
|
|
|
#endif /* end of include guard: BSP_I2C_H */
|
|
|