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.
143 lines
4.1 KiB
143 lines
4.1 KiB
2 years ago
|
#ifndef __BSP_I2C_SOFT_H
|
||
|
#define __BSP_I2C_SOFT_H
|
||
|
|
||
|
|
||
|
#include "main.h"
|
||
|
#include "stm32f4xx.h"
|
||
|
|
||
|
|
||
|
|
||
|
// //使用IIC1 PB6 -> SCL, PB7 -> SDA
|
||
|
|
||
|
#define SCL_PORT GPIOB
|
||
|
#define SCL_PIN GPIO_PIN_6
|
||
|
#define SDA_PORT GPIOB
|
||
|
#define SDA_PIN GPIO_PIN_7
|
||
|
|
||
|
// #define SDA_IN() { SDA_PORT->MODER &= ~(3 << 1 * 2); SDA_PORT->MODER = (0 << 1 * 2); } //PC1 1*2,
|
||
|
// #define SDA_OUT() { SDA_PORT->MODER &= ~(3 << 1 * 2); SDA_PORT->MODER = (1 << 1 * 2); }
|
||
|
|
||
|
#define SDA_IN() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 0<<7*2;} //PB7输入模式
|
||
|
#define SDA_OUT() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 1<<7*2;} //PB7输出模式
|
||
|
|
||
|
|
||
|
//IO操作函数
|
||
|
#define i2c_scl_low() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_RESET)
|
||
|
#define i2c_scl_high() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET)
|
||
|
|
||
|
#define i2c_sda_low() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_RESET)
|
||
|
#define i2c_sda_high() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET)
|
||
|
|
||
|
#define i2c_read_sda() HAL_GPIO_ReadPin( SDA_PORT, SDA_PIN )
|
||
|
|
||
|
extern uint32_t delay1us;
|
||
|
|
||
|
void delay_1us(uint32_t delay_1us);
|
||
|
|
||
|
void analog_i2c_delay(void);
|
||
|
|
||
|
void bsp_analog_i2c_init(void);
|
||
|
|
||
|
void bsp_analog_i2c_start(void);
|
||
|
|
||
|
void bsp_analog_i2c_stop(void);
|
||
|
|
||
|
uint8_t bsp_analog_i2c_wait_ack(void);
|
||
|
|
||
|
void bsp_analog_i2c_ack(void);
|
||
|
|
||
|
void bsp_analog_i2c_nack(void);
|
||
|
|
||
|
void bsp_analog_i2c_send_byte(uint8_t data);
|
||
|
|
||
|
uint8_t bsp_analog_i2c_read_byte(void);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// //使用IICX PB6 -> SCL, PB7 -> SDA
|
||
|
|
||
|
// #define SCL_PORT GPIOB
|
||
|
// #define SCL_PIN GPIO_PIN_6
|
||
|
// #define SDA_PORT GPIOB
|
||
|
// #define SDA_PIN GPIO_PIN_7
|
||
|
|
||
|
//IO方向设置
|
||
|
// #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} //PB7输入模式
|
||
|
// #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} //PB7输出模式
|
||
|
|
||
|
// #define SDA_IN() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 0<<7*2;} //PB7输入模式
|
||
|
// #define SDA_OUT() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 1<<7*2;} //PB7输出模式
|
||
|
|
||
|
// //IO操作
|
||
|
// #define IIC_SCL PBout(6) //SCL
|
||
|
// #define IIC_SDA PBout(7) //SDA
|
||
|
// #define READ_SDA PBin(7) //输入SDA
|
||
|
|
||
|
// //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);
|
||
|
|
||
|
/*
|
||
|
//在AT24CXX指定地址读出一个数据
|
||
|
//ReadAddr:开始读数的地址
|
||
|
//返回值 :读到的数据
|
||
|
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
|
||
|
{
|
||
|
u8 temp=0;
|
||
|
IIC_Start();
|
||
|
if(EE_TYPE>AT24C16)
|
||
|
{
|
||
|
IIC_Send_Byte(0XA0); //发送写命令
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Send_Byte(ReadAddr>>8);//发送高地址
|
||
|
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Send_Byte(ReadAddr%256); //发送低地址
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Start();
|
||
|
IIC_Send_Byte(0XA1); //进入接收模式
|
||
|
IIC_Wait_Ack();
|
||
|
temp=IIC_Read_Byte(0);
|
||
|
IIC_Stop();//产生一个停止条件
|
||
|
return temp;
|
||
|
}
|
||
|
//在AT24CXX指定地址写入一个数据
|
||
|
//WriteAddr :写入数据的目的地址
|
||
|
//DataToWrite:要写入的数据
|
||
|
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
|
||
|
{
|
||
|
IIC_Start();
|
||
|
if(EE_TYPE>AT24C16)
|
||
|
{
|
||
|
IIC_Send_Byte(0XA0); //发送写命令
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Send_Byte(WriteAddr>>8);//发送高地址
|
||
|
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Send_Byte(WriteAddr%256); //发送低地址
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Send_Byte(DataToWrite); //发送字节
|
||
|
IIC_Wait_Ack();
|
||
|
IIC_Stop();//产生一个停止条件
|
||
|
delay_ms(10);
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|