/*! * @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; }
/* * LPLD_SCCB_SendByte * SCCB接收数据,内部调用 */ static uint8 LPLD_SCCB_ReceiveByte(void) { uint8 i=8; uint8 ReceiveByte=0; SCCB_SDA_O=1; SCCB_DELAY(); SCCB_SDA_IN(); while(i--) { ReceiveByte<<=1; SCCB_SCL=0; SCCB_DELAY(); SCCB_SCL=1; SCCB_DELAY(); if(SCCB_SDA_I) { ReceiveByte|=0x01; } } SCCB_SDA_OUT(); SCCB_SCL=0; return ReceiveByte; }
/*! * @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; }
/* * LPLD_SCCB_Start * SCCB起始信号,内部调用 */ static uint8 LPLD_SCCB_Start(void) { SCCB_SDA_O=1; SCCB_SCL=1; SCCB_DELAY(); SCCB_SDA_IN(); if(!SCCB_SDA_I) { SCCB_SDA_OUT(); return 0; } SCCB_SDA_OUT(); SCCB_SDA_O=0; SCCB_DELAY(); SCCB_SDA_IN(); if(SCCB_SDA_I) { SCCB_SDA_OUT(); return 0; } SCCB_SDA_OUT(); SCCB_SDA_O=0; return 1; }
/* * LPLD_SCCB_Stop * SCCB停止信号,内部调用 */ static void LPLD_SCCB_Stop(void) { SCCB_SCL=0; SCCB_SDA_O=0; SCCB_DELAY(); SCCB_SCL=1; SCCB_SDA_O=1; SCCB_DELAY(); }
/*! * @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(); }
/* * LPLD_SCCB_NoAck * SCCB无应答信号,内部调用 */ static void LPLD_SCCB_NoAck(void) { SCCB_SCL=0; SCCB_DELAY(); SCCB_SDA_O=1; SCCB_DELAY(); SCCB_SCL=1; SCCB_DELAY(); SCCB_SCL=0; SCCB_DELAY(); }
/*! * @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; }
/* * LPLD_SCCB_SendByte * SCCB发送数据,内部调用 */ static void LPLD_SCCB_SendByte(uint8 data) { uint8 i=8; while(i--) { SCCB_SCL=0; SCCB_DELAY(); if(data&0x80) { SCCB_SDA_O=1; } else { SCCB_SDA_O=0; } data<<=1; SCCB_DELAY(); SCCB_SCL=1; SCCB_DELAY(); } SCCB_SCL=0; }
/* * LPLD_SCCB_WaitAck * SCCB等待应答信号,内部调用 */ static uint8 LPLD_SCCB_WaitAck(void) { SCCB_SCL=0; SCCB_DELAY(); SCCB_SDA_O=1; SCCB_DELAY(); SCCB_SCL=1; SCCB_SDA_IN(); SCCB_DELAY(); if(SCCB_SDA_I) { SCCB_SDA_OUT(); SCCB_SCL=0; return 0; } SCCB_SDA_OUT(); SCCB_SCL=0; 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(); }
/******************************************************************** * 函数名: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; }
/*! * @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(); }