byte MP3Player::i2c_rx(byte ack) { byte x, d=0; SDA_H(); for(x=0; x<8; x++) { d <<= 1; do { SCL_H(); } while(SCL_IN()==0); // wait for any SCL clock stretching i2c_dly(); if(SDA_IN()) d |= 1; SCL_L(); } if(ack) { SDA_L(); } else { SDA_H(); } SCL_H() i2c_dly(); // send (N)ACK bit SCL_L(); SDA_H(); return d; }
byte MP3Player::i2c_tx(byte d) { byte x; byte b; for(x=8; x; x--) { if(d&0x80) { SDA_H(); } else { SDA_L(); } SCL_H(); d <<= 1; SCL_L(); } SDA_H(); SCL_H(); i2c_dly(); b = SDA_IN(); // possible ACK bit SCL_L(); return b; }
/*! * @brief 接收SCCB总线的数据 * @return 接收到的数据 * @since v5.0 */ static int SCCB_ReceiveByte(void) { uint8 i = 8; uint8 ReceiveByte = 0; //SDA_H(); //SCCB_DELAY(); SDA_DDR_IN(); while(i--) { ReceiveByte <<= 1; SCL_L(); SCCB_DELAY(); SCL_H(); SCCB_DELAY(); if(SDA_IN()) { ReceiveByte |= 0x01; } } SDA_DDR_OUT(); SCL_L(); return ReceiveByte; }
/*! * @brief SCCB起始信号 * @since v5.0 */ static uint8 SCCB_Start(void) { SDA_H(); SCL_H(); SCCB_DELAY(); SDA_DDR_IN(); if(!SDA_IN()) { SDA_DDR_OUT(); return 0; /* SDA线为低电平则总线忙,退出 */ } SDA_DDR_OUT(); SDA_L(); SCCB_DELAY(); SCL_L(); if(SDA_IN()) { SDA_DDR_OUT(); return 0; /* SDA线为高电平则总线出错,退出 */ } //SDA_DDR_OUT(); //SDA_L(); //SCCB_delay(); return 1; }
void MP3Player::i2c_stop(void) { SDA_L(); // i2c stop bit sequence i2c_dly(); SCL_H(); i2c_dly(); SDA_H(); i2c_dly(); }
/** * \brief I2C Stop,Internal function * \retval None */ static void I2C_Stop(void) { SCL_L(); SDA_L(); I2C_DELAY(); SCL_H(); SDA_H(); I2C_DELAY(); }
/** * \brief I2C Ack,Internal function * \retval None */ static void I2C_Ack(void) { SCL_L(); SDA_L(); I2C_DELAY(); SCL_H(); I2C_DELAY(); SCL_L(); I2C_DELAY(); }
/******************************************************************************* * 函数名称:TWI_SendACK * 描 述:收到数据,发送ACK *******************************************************************************/ static void IIC_SendACK(void) { SCL_L(); SDA_L(); IIC_Dealy(); SCL_H(); IIC_Dealy(); SCL_L(); IIC_Dealy(); }
/******************************************************************* TWI_STOP 发送停止数据 *******************************************************************/ static void IIC_Stop(void) { SDA_L(); SCL_H(); IIC_Dealy(); SDA_H(); IIC_Dealy(); SDA_H(); }
/** * \brief I2C Start,Internal function * \retval true */ static bool I2C_Start(void) { SDA_DDR_OUT(); SDA_H(); SCL_H(); I2C_DELAY(); SDA_L(); I2C_DELAY(); SCL_L(); return true; }
/*! * @brief SCCB应答信号 * @since v5.0 */ static void SCCB_Ack(void) { SCL_L(); SCCB_DELAY(); SDA_L(); SCCB_DELAY(); SCL_H(); SCCB_DELAY(); SCL_L(); SCCB_DELAY(); }
/*! * @brief SCCB停止信号 * @since v5.0 */ static void SCCB_Stop(void) { SCL_L(); //SCCB_DELAY(); SDA_L(); SCCB_DELAY(); SCL_H(); SCCB_DELAY(); SDA_H(); SCCB_DELAY(); }
/******************************************************************************* * 函数名称:TWI_SendByte * 描 述:发送一个字节 *******************************************************************************/ static u8 IIC_SendByte(u8 Data) { uint8_t i; for(i=0;i<8;i++) { SCL_L(); IIC_Dealy(); if(Data&0x80) { SDA_H(); } else { SDA_L(); } Data<<=1; IIC_Dealy(); SCL_H(); IIC_Dealy(); } //接收从机的应答 SCL_L(); IIC_Dealy(); SCL_H(); IIC_Dealy(); if(IIC_SDA_STATE) { printf("no ack"); SCL_L(); return IIC_NACK; } else { SCL_L(); return IIC_ACK; } }
/** * \brief I2C Wait Ack,Internal function * \return 应答信号 */ static bool I2C_WaitAck(void) { uint8_t ack; SDA_DDR_IN(); SCL_L(); I2C_DELAY(); SCL_H(); I2C_DELAY(); ack = SDA_IN(); SCL_L(); SDA_DDR_OUT(); return ack; }
void I2C_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Configure I2C1 pins: SCL and SDA */ GPIO_InitStructure.GPIO_Pin = IIC_SCL_Pin | IIC_SDA_Pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); SDA_H(); SCL_H(); }
/** * \brief I2C 发送一个字节数据,Internal function * \param[in] data 待发送的数据(字节) * \retval None */ static void I2C_SendByte(uint8_t data) { volatile uint8_t i; i = 8; while(i--) { if(data & 0x80) SDA_H(); else SDA_L(); data <<= 1; I2C_DELAY(); SCL_H(); I2C_DELAY(); SCL_L(); } }
/** * \brief I2C 接收一个字节数据,Internal function * \return 待接收的数据(字节) */ static uint8_t I2C_GetByte(void) { uint8_t i,byte; i = 8; byte = 0; SDA_DDR_IN(); while(i--) { SCL_L(); I2C_DELAY(); SCL_H(); I2C_DELAY(); byte = (byte<<1)|(SDA_IN() & 1); } SCL_L(); SDA_DDR_OUT(); return byte; }
/******************************************************************* TWI_START 发送启动数据 *******************************************************************/ static uint8_t IIC_Start(void) { SDA_H(); SCL_H(); IIC_Dealy(); if( IIC_SDA_STATE == RESET ) { return IIC_BUS_BUSY; } SDA_L(); IIC_Dealy(); if( IIC_SDA_STATE == SET ) { return IIC_BUS_ERROR; } return IIC_BUS_READY; }
/*! * @brief SCCB 等待应答 * @return 应答结果(0表示无应答,1表示有应答) * @since v5.0 */ static int SCCB_WaitAck(void) { SCL_L(); //SDA_H(); SDA_DDR_IN(); SCCB_DELAY(); SCL_H(); SCCB_DELAY(); if(SDA_IN()) //应答为高电平,异常,通信失败 { SDA_DDR_OUT(); SCL_L(); return 0; } SDA_DDR_OUT(); SCL_L(); return 1; }
/******************************************************************************* * 函数名称:TWI_ReceiveByte * 描 述:接收一个字节 *******************************************************************************/ static char IIC_RecvByte(void) { char i,Dat = 0; SDA_H(); Dat=0; for(i=0;i<8;i++) { SCL_L(); IIC_Dealy(); SCL_H();//产生时钟上升沿[正脉冲],让从机准备好数据 IIC_Dealy(); Dat<<=1; if(IIC_SDA_STATE) //读引脚状态 { Dat|=0x01; } } return Dat; }
/******************************************************************** * 函数名:SCCB_WaitAck * 描述 :SCCB 等待应答 * 输入 :无 * 输出 :返回为:=1有ACK,=0无ACK * 注意 :内部调用 ********************************************************************/ static int SCCB_WaitAck(void) { SCL_L(); SCCB_DELAY(); SDA_H(); SCCB_DELAY(); SCL_H(); SDA_DDR_IN(); SCCB_DELAY(); if(SDA_IN()) { SDA_DDR_OUT(); SCL_L(); return 0; } SDA_DDR_OUT(); SCL_L(); return 1; }
/******************************************************************* * 函数名:SCCB_SendByte * 描述 :数据从高位到低位 * 输入 :SendByte: 发送的数据 * 输出 :无 * 注意 :内部调用 *********************************************************************/ static void SCCB_SendByte(uint8 SendByte) { uint8 i=8; while(i--) { SCL_L(); SCCB_DELAY(); if(SendByte&0x80) { SDA_H(); } else { SDA_L(); } SendByte<<=1; SCCB_DELAY(); SCL_H(); SCCB_DELAY(); } SCL_L(); }
/*! * @brief SCCB 发送的数据 * @param SendByte 需要发送的数据 * @since v5.0 */ static void SCCB_SendByte(uint8 SendByte) { uint8 i = 8; while(i--) { if(SendByte & 0x80) //SDA 输出数据 { SDA_H(); } else { SDA_L(); } SendByte <<= 1; SCCB_DELAY(); SCL_H(); //SCL 拉高,采集信号 SCCB_DELAY(); SCL_L(); //SCL 时钟线拉低 //SCCB_DELAY(); } //SCL_L(); }