STM32学习-IIC
资源内容介绍
STM32学习-IIC /*********************************************************************************************@filemyiic.c*@author加州大溪没*@brief********************************************************************************************/#include "./SYSTEM/sys/sys.h"#include "./SYSTEM/delay/delay.h"#include "./SYSTEM/my_iic/myiic.h"/**@brief对IIC硬件配置进行初始化*@paramNone*@noteNone*@retvalNone*/void IIC_Init(){GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;gpio_init_struct.Pin = SCL_PIN | SDA_PIN;gpio_init_struct.Speed= GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(SCL_PORT, &gpio_init_struct);SCL(1);SDA(1);}/**@brief产生一个IIC通信开始信号*@paramNone*@noteSDA---1* \*\* -----0*SCL----------1*@retvalNone*/void IIC_Start(){SDA(1);IIC_Delay();SCL(1);IIC_Delay();SDA(0);IIC_Delay();SCL(0);//钳住SCL线,为后面的操作做准备IIC_Delay();}/**@brief产生一个IIC通信停止信号*@paramNone*@noteSDA ---1* /* /*-----0*SCL----------1*@retvalNone*/void IIC_Stop(){SDA(0);IIC_Delay();SCL(1);IIC_Delay();SDA(1);IIC_Delay();}/**@brief发送一个应答 / 未应答信号*@paramAckBit:1未应答*0应答*@noteSDA --------------0 / 1*SCL ----1* / \* /\*--- ---0*@retvalNone*/void IIC_SendAck(uint8_t AckBit){SDA(AckBit);IIC_Delay();SCL(1);IIC_Delay();SCL(0);IIC_Delay();}/**@brief接收一个应答 / 未应答信号*@paramNone*@noteSDA --------------0 / 1*SCL ----1* / \* /\*--- ---0*@retvalAckBit:接收到的应答 / 未应答信号*/uint8_t IIC_ReceiveAck(){uint8_t AckBit;SDA(1);IIC_Delay();SCL(1);IIC_Delay();AckBit = SDA_READ;IIC_Delay();SCL(0);IIC_Delay();return AckBit;}/**@brief发送一个字节的数据*@paramdata:待发送的数据*@noteSDA --------------0 / 1*SCL ----1* / \* /\*--- ---0*@retvalNone*/void IIC_Send_Byte(uint8_t data){uint8_t i;for(i = 0; i < 8; i++){SDA(data & (0X80 >> i));//一位一位发送数据IIC_Delay();SCL(1);IIC_Delay();SCL(0);IIC_Delay();}}/**@brief发送一个字节的数据*@paramNone*@noteSDA --------------0 / 1*SCL ----1* / \* /\*--- ---0*@retvalReceive_Data:接收到的一字节的数据*/uint8_t IIC_Receive_Byte(){uint8_t i, Receive_Data = 0x00;SDA(1);IIC_Delay();for(i = 0; i < 8; i++){SCL(1);IIC_Delay();if(SDA_READ)Receive_Data |= (0x80 >> i);//一位一位接收数据SCL(0);IIC_Delay();}return Receive_Data;//返回读取到的数据}/**@brief发送一个字节的数据*@paramaddr:从机的地址*reg:从机寄存器地址*@note读操作,AD+R末位为1*写操作,AD+W末位为0*只读一次:*MasterSAD+WRADATAP*SlaveACKACKACK*读多次:*MasterSAD+WRADATADATAP*SlaveACKACKACKACK*@retvalData_Temp:IIC读取操作读取到的数据,可以连读*/void IIC_Write(uint8_t addr, uint8_t reg, uint8_t data){IIC_Start();IIC_Send_Byte(addr);IIC_ReceiveAck();IIC_Send_Byte(reg);IIC_ReceiveAck();IIC_Send_Byte(data);IIC_ReceiveAck();IIC_Stop();}/**@brief接收一个字节的数据*@paramaddr:从机的地址*reg:从机寄存器地址*@note读操作,AD+R末位为1*写操作,AD+W末位为0*只读一次:*MasterSAD+WRASAD+RNACKP*SlaveACKACKACKDATA*读多次:*MasterSAD+WRASAD+RACKNACKP*SlaveACKACKACKDATADATA*@retvalData_Temp:IIC读取操作读取到的数据,可以连读*/uint8_t IIC_Read(uint8_t addr, uint8_t reg){uint8_t Data_Temp = 0;IIC_Start();IIC_Send_Byte(addr);IIC_ReceiveAck();IIC_Send_Byte(reg);IIC_ReceiveAck();IIC_Start();IIC_Send_Byte(addr | 0x01);IIC_ReceiveAck();Data_Temp = IIC_Receive_Byte();IIC_SendAck(1);IIC_Stop();return Data_Temp;}/* END OF FILE ********************************************************** */