📄 i2csubs_slave.c
字号:
#include <p30F4011.h>
#include <I2C.h>
#include "I2CSubs_slave.h"
#define REPORT_NACK { \
IFS0bits.MI2CIF = 0 ; \
StopI2C( ) ; \
while ( I2CCONbits.PEN ) ; \
return -1 ; \
}
unsigned char I2C_ACKPolling(unsigned char CMD)
{
unsigned char ACK_Result ;
IdleI2C( ) ;
StartI2C( ) ;
while ( I2CCONbits.SEN) ; // Send START bit ! SEN will be clear automatically once START bits completed
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C((CMD & 0xFE)) ;
while(! IFS0bits.MI2CIF ) ; // MI2CIF will be clear after data transmitted completely !
if ( I2CSTATbits.ACKSTAT ) ACK_Result = 1 ;
else ACK_Result = 0 ;
IFS0bits.MI2CIF = 0 ;
StopI2C( ) ;
while ( I2CCONbits.PEN ) ;
return ACK_Result ;
}
void Init_I2C(void)
{
unsigned int config1 , config2 ;
I2CADD = SLAVE_ADDRESS ;
config2 = 0x80;
config1 = I2C_ON & I2C_IDLE_STOP&I2C_CLK_REL
& I2C_IPMI_DIS & I2C_7BIT_ADD
& I2C_SLW_EN & I2C_SM_DIS
& I2C_GCALL_DIS & I2C_STR_DIS
& I2C_NACK & I2C_ACK_DIS & I2C_RCV_EN
& I2C_STOP_DIS & I2C_RESTART_DIS
& I2C_START_DIS ;
ConfigIntI2C(MI2C_INT_OFF & MI2C_INT_PRI_0 & SI2C_INT_ON & SI2C_INT_PRI_6 ) ;
OpenI2C(config1,config2) ;
TRISFbits.TRISF2 = 1 ;
TRISFbits.TRISF3 = 1 ;
}
int EEPROM_ByteWrite(unsigned char CMD , unsigned char Addr , unsigned char Data )
{
IdleI2C( ) ;
StartI2C( ) ;
while ( I2CCONbits.SEN) ; // Send START bit ! SEN will be clear automatically once START bits completed
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C((CMD & 0xFE)) ;
while(! IFS0bits.MI2CIF ) ; // MI2CIF will be clear after data transmitted completely !
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C(Addr) ;
while(! IFS0bits.MI2CIF ) ;
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C(Data) ;
while(! IFS0bits.MI2CIF ) ;
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
StopI2C( ) ;
while ( I2CCONbits.PEN ) ;
return 0 ;
}
int EEPROM_ByteRead(unsigned char CMD , unsigned char Addr )
{
unsigned char Temp_Buffer ;
IdleI2C( ) ;
StartI2C( ) ;
while ( I2CCONbits.SEN) ;
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C((CMD & 0xFE)) ; // Mask bit 0 -> Write command
while(! IFS0bits.MI2CIF ) ;
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C(Addr) ;
while(! IFS0bits.MI2CIF ) ;
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
RestartI2C( ) ;
while ( I2CCONbits.RSEN) ;
IFS0bits.MI2CIF = 0 ;
MasterWriteI2C((CMD | 0x01)) ; // Set bit 0 for "Read" command
while(! IFS0bits.MI2CIF ) ;
if ( I2CSTATbits.ACKSTAT )
REPORT_NACK
IFS0bits.MI2CIF = 0 ;
Temp_Buffer = MasterReadI2C( ) ;
while(! IFS0bits.MI2CIF ) ;
IFS0bits.MI2CIF = 0 ;
NotAckI2C( ) ;
while(! IFS0bits.MI2CIF ) ;
IFS0bits.MI2CIF = 0 ;
StopI2C( ) ;
while ( I2CCONbits.PEN ) ;
return (int)Temp_Buffer ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -