📄 iic_slave.bak
字号:
#pragma sfr
#pragma di
#pragma ei
#pragma nop
#pragma interrupt INTIIC0 IIC_Interrupt
#include "serial_config.h"
unsigned char IIC_Slave_Receive_StartFlag = 0;
unsigned char IIC_Slave_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_Operation_Enable();
// IICC0 = IIC_StopCondition_Interrupt + IIC_Interrupt_Clock_Number + IIC_ACK_Enable + 0x80;
// IICF0 = IIC_Start_Condition_WithoutStopDetect + IIC_Communication_Reservation_Disable;
IIC_Interrupt_Enable();
}
void IIC_SlaveStart()
{
if( IIC_Local_Address & 1 ){
return ; /* bit0 isn't 0 */
}
IICC0 = 0x9c; /* start transfer */
SVA0 = IIC_Local_Address; /* set slave address */
}
void IIC0_Stop( void )
{
IICE0 = 0; /* stop transfer */
}
void IIC0_SlaveHandler()
{
/* control for stop condition */
if( IICS0 & 0x01 ){ /* get stop condition */
/* slave send end and get stop condition */
if( IIC_Slave_StartFlag &&( IIC_Slave_SendCount == 0 ) ){
return;
} else {
return;
}
}
/* control for get address */
if( IIC_Slave_StartFlag == 0 ){
if( !(IICS0 & 0x20) ){ /* check EXC0 -> external code */
if( IICS0 & 0x10 ){ /* check COI0 -> address */
IIC_Slave_StartFlag = 1;
// CALL_IIC0_SlaveAddressMatch(); /* slave address match */
}
else{
//CALL_IIC0_SlaveError(MD_ERROR);
return;
}
}
else{
// CALL_IIC0_SlaveError( MD_ERROR );
return;
}
}
/* slave send control */
if( IICS0 & 0x08 ){
WTIM0 = 1; /////////
if(!( IICS0 & 0x04 )){ /* check ACKD0 -> acknowledge */
WREL0 = 1;
return;
}
IIC0 = *IIC_Slave_SendBuf ++ ;
IIC_Slave_SendCount --;
}
/* slave receive control */
else{
WTIM0 = 0;
// ACKE0 = 1;
WREL0 = 1; /* WREL1 = 1 start receive */
*IIC_Slave_ReceiveBuf ++ = IIC0;
IIC_Slave_ReceiveCount--;
// WREL0 = 1; /* WREL1 = 1 start receive */
if( IIC_Slave_ReceiveCount == 0 ){ /* check all data received */
ACKE0 = 0; /* clear ACKE0 */
}
}
}
void main()
{
DI();
PCC = 0x00;
IIC0_Init();
IIC_SlaveStart();
EI();
while(1);
}
__interrupt void IIC_Interrupt()
{
if(!( IICS0 & 0x80) ) {
IIC0_SlaveHandler();
}
else {
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -