/******************************************************************** * 函数名:SCCB_Start * 描述 :SCCB起始信号 * 输入 :无 * 输出 :无 * 注意 :内部调用 ********************************************************************/ 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(); SDA_DDR_IN(); if(SDA_IN()) { SDA_DDR_OUT(); return 0; /* SDA线为高电平则总线出错,退出 */ } SDA_DDR_OUT(); SDA_L(); //SCCB_delay(); return 1; }
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 I2C Stop,Internal function * \retval None */ static void I2C_Stop(void) { SCL_L(); SDA_L(); I2C_DELAY(); SCL_H(); SDA_H(); I2C_DELAY(); }
void MP3Player::i2c_stop(void) { SDA_L(); // i2c stop bit sequence i2c_dly(); SCL_H(); i2c_dly(); SDA_H(); i2c_dly(); }
/** * \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 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(); }
/** * \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 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(); } }
/******************************************************************************* * 函数名称: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; } }
/******************************************************************* 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; }
/******************************************************************* * 函数名: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(); }