/*-------------------------------------------------------------------------------------- * @file IICSetup.c * @author ZhangJing * @version base on stm32f0x * @date 2015.09.11 * @brief 模拟IIC驱动 ---------------------------------------------------------------------------------------*/ #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "TypeDefine.h" #include "IICSetup.h" #include "IIC2Setup.h" /****************************************************************************** *函数名: TWI_Delay * *功能描述: 延时函数 * *输入参数: 无 * *输出参数: 无 * *返回值: 无 * ******************************************************************************/ void TWI2_Delay(void) { uint8_t i = 15; while(i--); } /************************************************************************************* * Function: IIC2Init * Object: 用I/O口模拟的IIC初始化 * 输入: 无 * 输出: 无 * 备注: **************************************************************************************/ void IIC2Init( void ) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // PA10-SDA PA9-SCL GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; TWI2_SDA_1; TWI2_SCL_1; GPIO_Init(GPIOA, &GPIO_InitStructure); } /************************************************************************************* * Function: TWI_START * Object: 发送启动 * 输入: 无 * 输出: 无 * 备注: **************************************************************************************/ uint8_t TWI2_START(void) { TWI2_SDA_1; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; if(!TWI2_SDA_STATE) { ////DebugPrint("TWI_START:BUSY\n"); return TWI_BUS_BUSY; } TWI2_SDA_0; TWI2_NOP; if(TWI2_SDA_STATE) { ////DebugPrint("TWI_START:BUS ERROR\n"); return TWI_BUS_ERROR; } TWI2_SCL_0; TWI2_NOP; return TWI_READY; } /************************************************************************************* * Function: TWI_STOP * Object: 发送停止位 * 输入: 无 * 输出: 无 * 备注: **************************************************************************************/ void TWI2_STOP(void) { TWI2_SCL_0; TWI2_NOP; TWI2_SDA_0; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; TWI2_SDA_1; TWI2_NOP; // TWI2_SCL_0; // TWI2_NOP; //////DebugPrint("TWI_STOP\n"); } /************************************************************************************* * Function: TWI_SendACK * Object: 收到数据发送ACK * 输入: 无 * 输出: 无 * 备注: **************************************************************************************/ void TWI2_SendACK(void) { TWI2_SCL_0; TWI2_NOP; TWI2_SDA_0; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; TWI2_SCL_0; TWI2_NOP; //////DebugPrint("TWI_SendACK\n"); } /************************************************************************************* * Function: TWI2_SendNACK * Object: 收到数据发送NACK * 输入: 无 * 输出: 无 * 备注: **************************************************************************************/ void TWI2_SendNACK(void) { TWI2_SCL_0; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; TWI2_SDA_1; TWI2_NOP; TWI2_SCL_0; TWI2_NOP; //////DebugPrint("TWI_SendNACK\n"); } /************************************************************************************* * Function: TWI2_WaitAck * Object: 收到数据等待ACK * 输入: 无 * 输出: 返回IIC总线状态 * 备注: **************************************************************************************/ uint8_t TWI2_WaitAck(void) { TWI2_SCL_0; TWI2_NOP; TWI2_SDA_1; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; if(TWI2_SDA_STATE) { TWI2_SCL_0; return 0x00; } TWI2_SCL_0; return 0x01; } /************************************************************************************* * Function: TWI2_SendByte * Object: 发送一个字节 * 输入: 要发送的数据(一个字节) * 输出: 返回IIC总线状态 * 备注: **************************************************************************************/ uint8_t TWI2_SendByte(uint8_t Data) { uint8_t i; TWI2_SCL_0; for(i=0;i<8;i++) { TWI2_SCL_0; TWI2_NOP; //数据建立保持一定延时 if(Data&0x80) { TWI2_SDA_1; } else { TWI2_SDA_0; } Data<<=1; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; } TWI2_SCL_0; if(TWI2_SDA_STATE) { // TWI2_SCL_0; //////DebugPrint("TWI_NACK!\n"); return TWI_NACK; } else { // TWI2_SCL_0; //////DebugPrint("TWI_ACK!\n"); return TWI_ACK; } } /************************************************************************************* * Function: TWI2_ReceiveByte * Object: 接收一个字节 * 输入: 无 * 输出: 返回接收到的数据 * 备注: 1、uint8_t Dat = 0;按位做接收数据组合 **************************************************************************************/ uint8_t TWI2_ReceiveByte(void) { uint8_t i,Dat = 0; TWI2_SDA_1; //TWI2_SCL_0; Dat=0; for(i=0;i<8;i++) { //TWI2_SCL_1;//???????[???],???????? //TWI2_NOP; Dat<<=1; TWI2_SCL_0; TWI2_NOP; TWI2_SCL_1; TWI2_NOP; if(TWI2_SDA_STATE) //读引脚状态 { Dat|=0x01; } TWI2_SCL_0;//准备好再次接收数据 //TWI2_NOP;//等待数据准备好 } //////DebugPrint("TWI_Dat:%x\n",Dat); return Dat; }