#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