📄 iic_master.c
字号:
#pragma sfr
#pragma di
#pragma ei
#pragma nop
#pragma interrupt INTIIC0 IIC_Interrupt
#include "serial_config.h"
unsigned char i=255;
unsigned char iic0_m_sta_flag=0;
unsigned char IIC_Master_Receive_StartFlag = 0;
void IIC0_Init()
{
IIC_Operation_Disable();
IICMK0 = 1;
IIC_SCL0_Port_Mode = output;
IIC_SDA0_Port_Mode = output;
IIC_SCL0_Port_Level = low;
IIC_SDA0_Port_Level = low;
IICF0 = 0x03;
IICC0 = 0x10;
IIC_Clk_Select();
SVA0 = IIC_Local_Address;
IIC_Interrupt_Enable();
}
void IIC_MasterStart()
{
DI();
/* control for stop condition */
if( ( IICF0 & 0x40 ) ){
EI(); /* get stop condition */
return;
}
IICC0 = 0x1c;
IICC0 = 0x9c;
STT0 = 1;
EI();
while(i--);
if( !(IICS0 & 0x02)){ return;}
IIC0 = IIC_Slave_Address + IIC_Master_Mode;
}
void IIC0_MasterHandler()
{
/* control for stop condition */
if( !( IICF0 & 0x40 ) ){ /* get stop condition */
//CALL_IIC0_MasterError(MD_SPT);
return; //MD_SPT;
}
/* control for sended condition */
/* if( !iic0_m_sta_flag ){
if( IICS0 & 0x04 ){ /* check ACK
iic0_m_sta_flag = 1; /* address complete
//CALL_IIC0_MasterFindSlave();
}
else{
//CALL_IIC0_MasterError(MD_NACK);
return; //MD_NACK;
}
}
/* master send control */
else if( (IICS0 & 0x08) ){
if( !(IICS0 & 0x04) ){ /* check ACK */
SPT0 = 1; //SetIORBit(IICC0, 0x01); /* generate stop condition */
//CALL_IIC0_MasterError(MD_NACK);
return; //MD_NACK;
}
if( IIC_Master_SendCount == 0 ){ /* sended finish */
SPT0 = 1; //SetIORBit(IICC0, 0x01); /* generate stop condition */
//CALL_IIC0_MasterSendEnd( );
return;// MD_MASTER_SEND_END;
}
IIC0 = *IIC_Master_SendBuf ++ ; /* send data */
IIC_Master_SendCount--;
}
/* master receive control */
else {
WTIM0 = 0;
if(IIC_Master_Receive_StartFlag == 1){
*IIC_Master_ReceiveBuf ++ = IIC0; /* receive data */
IIC_Master_ReceiveCount--; }
if( IIC_Master_ReceiveCount == 0 ){ /* receive finish */
IIC_Master_Receive_StartFlag = 0;
ACKE0 = 0; //ClrIORBit(IICC0, 0x04); /* ACK STOP */
WTIM0 = 1;
WREL0 = 1;
SPT0 = 1; //SetIORBit(IICC0, 0x01); /* generate stop condition */
//CALL_IIC0_MasterReceiveEnd( );
return; //MD_MASTER_RCV_END;
}
IIC_Master_Receive_StartFlag = 1;
WREL0 = 1; //SetIORBit(IICC0, 0x20); /* start receive */
}
}
void main()
{
DI();
PCC = 0x00;
IIC0_Init();
IIC_MasterStart();
while(1);
}
__interrupt void IIC_Interrupt()
{
/* control for sended condition */
// if( !IIC_Master_Start_Flag ){
// if( IICS0 & IIC_ACK_Detected ){ /* check ACK */
// IIC_Master_Start_Flag = 1; /* address complete */
// }
// else{
// return;
// }
// }
/* master send control */
/* else*/// if( IICS0 & IIC_Transmit_Status ){
// IIC_MasterSend();
// }
/* master receive control */
// else {
// IIC_MasterReceive();
// }
if( IICS0 & 0x80 ) {
IIC0_MasterHandler();
}
else {
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -