修复开关控制组控的控制异常问题
修改PB开关状态组控处理,解决后32路的开关状态会复用上前32个回路的数据
This commit is contained in:
569
Source/FWlib/apt32f102_i2c.c
Normal file
569
Source/FWlib/apt32f102_i2c.c
Normal file
@@ -0,0 +1,569 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file apt32f102_i2c.c
|
||||
* @author APT AE Team
|
||||
* @version V1.08
|
||||
* @date 2021/06/21
|
||||
******************************************************************************
|
||||
*THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES
|
||||
*CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
|
||||
*APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT,
|
||||
*INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
|
||||
*SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
|
||||
*CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES
|
||||
*THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "apt32f102_i2c.h"
|
||||
volatile uint8_t I2CWrBuffer[BUFSIZE];
|
||||
volatile uint8_t I2CRdBuffer[BUFSIZE];
|
||||
volatile uint8_t RdIndex = 0;
|
||||
volatile uint8_t WrIndex = 0;
|
||||
volatile uint8_t I2C_Data_Adress;
|
||||
volatile uint8_t I2C_St_Adress;
|
||||
volatile U8_T f_ERROR=0;
|
||||
volatile U32_T R_IIC_ERROR_CONT;
|
||||
extern void delay_nms(unsigned int t);
|
||||
/*************************************************************/
|
||||
//I2C RESET,CLEAR ALL REGISTER
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_DeInit(void)
|
||||
{
|
||||
I2C0->ENABLE = 0;
|
||||
I2C0->IMSCR = 0;
|
||||
I2C0->ICR = 0X7FFF;
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C MASTER Initial
|
||||
//EntryParameter:SPEEDMODE,MASTERBITS,
|
||||
//SPEEDMODE:FAST_MODE(>100K),STANDARD_MODE(<100K)
|
||||
//MASTERBITS:I2C_MASTRER_7BIT/I2C_MASTRER_10BIT
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Master_CONFIG(I2C_SDA_TypeDef I2C_SDA_IO,I2C_SCL_TypeDef I2C_SCL_IO,I2C_SPEEDMODE_TypeDef SPEEDMODE,
|
||||
I2C_MASTRERBITS_TypeDef MASTERBITS,U16_T I2C_MASTER_ADDS,U16_T SS_SCLHX,U16_T SS_SCLLX)
|
||||
{
|
||||
//SDA IO Initial
|
||||
if(I2C_SDA_IO==I2C_SDA_PA00)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFFF0) | 0x00000005; //PA0.0->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA03)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFF0FFF) | 0x00006000; //PA0.3->SDA
|
||||
}
|
||||
else if (I2C_SDA_IO==I2C_SDA_PA07)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0X0FFFFFFF) | 0x40000000; //PA0.7->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA013)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0XFF0FFFFF) | 0x00600000; //PA0.13->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA014)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0XF0FFFFFF) | 0x06000000; //PA0.14->SDA
|
||||
}
|
||||
//SCL IO Initial
|
||||
if (I2C_SCL_IO==I2C_SCL_PB00)
|
||||
{
|
||||
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFFFF0) | 0x00000006; //PB0.0->SCL
|
||||
}
|
||||
else if (I2C_SCL_IO==I2C_SCL_PB02)
|
||||
{
|
||||
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFF0FF) | 0x00000400; //PB0.2->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA01)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFF0F) | 0x00000050; //PA0.1->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA04)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFF0FFFF) | 0x00060000; //PA0.4->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA06)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XF0FFFFFF) | 0x06000000; //PA0.6->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA015)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0X0FFFFFFF) | 0x60000000; //PA0.15->SCL
|
||||
}
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFFE)|I2C_DISABLE;
|
||||
I2C0->CR =(I2C0->CR&0XFFFFF000)|I2C_MASTER_EN |I2C_SLAVE_DIS| SPEEDMODE | MASTERBITS | I2C_RESTART_EN; //Repeat start bit enable
|
||||
I2C0->TADDR =I2C_MASTER_ADDS;
|
||||
if(SPEEDMODE==FAST_MODE)
|
||||
{
|
||||
I2C0->FS_SCLH = SS_SCLHX; //SCL high time
|
||||
I2C0->FS_SCLL = SS_SCLLX; //SCL low time
|
||||
}
|
||||
else if(SPEEDMODE==STANDARD_MODE)
|
||||
{
|
||||
I2C0->SS_SCLH = SS_SCLHX; //SCL high time
|
||||
I2C0->SS_SCLL = SS_SCLLX; //SCL low time
|
||||
}
|
||||
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C SLAVE Initial
|
||||
//EntryParameter:SPEEDMODE,SLAVEBITS,I2C_SALVE_ADD
|
||||
//SPEEDMODE:FAST_MODE(>100K),STANDARD_MODE(<100K)
|
||||
//SLAVEBITS:I2C_SLAVE_7BIT/I2C_SLAVE_10BIT
|
||||
//I2C_SALVE_ADD:I2C SLAVE ADDRESS
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Slave_CONFIG(I2C_SDA_TypeDef I2C_SDA_IO,I2C_SCL_TypeDef I2C_SCL_IO,I2C_SPEEDMODE_TypeDef SPEEDMODE,
|
||||
I2C_SLAVEBITS_TypeDef SLAVEBITS,U16_T I2C_SALVE_ADDS,U16_T SS_SCLHX,U16_T SS_SCLLX)
|
||||
{
|
||||
//SDA IO Initial
|
||||
if(I2C_SDA_IO==I2C_SDA_PA00)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFFF0) | 0x00000005; //PA0.0->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA03)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFF0FFF) | 0x00006000; //PA0.3->SDA ///
|
||||
}
|
||||
else if (I2C_SDA_IO==I2C_SDA_PA07)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0X0FFFFFFF) | 0x40000000; //PA0.7->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA013)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0XFF0FFFFF) | 0x00600000; //PA0.13->SDA
|
||||
}
|
||||
else if(I2C_SDA_IO==I2C_SDA_PA014)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0XF0FFFFFF) | 0x06000000; //PA0.14->SDA
|
||||
}
|
||||
//SCL IO Initial
|
||||
if (I2C_SCL_IO==I2C_SCL_PB00)
|
||||
{
|
||||
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFFFF0) | 0x00000006; //PB0.0->SCL
|
||||
}
|
||||
else if (I2C_SCL_IO==I2C_SCL_PB02)
|
||||
{
|
||||
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFF0FF) | 0x00000400; //PB0.2->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA01)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFF0F) | 0x00000050; //PA0.1->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA04)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFF0FFFF) | 0x00060000; //PA0.4->SCL //
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA06)
|
||||
{
|
||||
GPIOA0->CONLR = (GPIOA0->CONLR&0XF0FFFFFF) | 0x06000000; //PA0.6->SCL
|
||||
}
|
||||
else if(I2C_SCL_IO==I2C_SCL_PA015)
|
||||
{
|
||||
GPIOA0->CONHR = (GPIOA0->CONHR&0X0FFFFFFF) | 0x60000000; //PA0.15->SCL
|
||||
}
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFFE)|I2C_DISABLE;
|
||||
I2C0->CR =(I2C0->CR&0XFFFFF000)| I2C_MASTER_DIS |I2C_SLAVE_EN | SPEEDMODE | SLAVEBITS;
|
||||
I2C0->SADDR = I2C_SALVE_ADDS;
|
||||
if(SPEEDMODE==FAST_MODE)
|
||||
{
|
||||
I2C0->FS_SCLH = SS_SCLHX; //SCL high time
|
||||
I2C0->FS_SCLL = SS_SCLLX; //SCL low time
|
||||
}
|
||||
else if(SPEEDMODE==STANDARD_MODE)
|
||||
{
|
||||
I2C0->SS_SCLH = SS_SCLHX; //SCL high time
|
||||
I2C0->SS_SCLL = SS_SCLLX; //SCL low time
|
||||
}
|
||||
INTC_IPR4_WRITE(0X40400040); //setting highest INT Priority when using i2c as salve
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C SDA TSETUP THOLD CONFIG
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_SDA_TSETUP_THOLD_CONFIG(U8_T SDA_TSETUP , U8_T SDA_RX_THOLD , U16_T SDA_TX_THOLD)
|
||||
{
|
||||
I2C0->SDA_TSETUP=SDA_TSETUP;
|
||||
I2C0->SDA_THOLD=(SDA_RX_THOLD<<16)|SDA_TX_THOLD;
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C INT CONFIG
|
||||
//EntryParameter:I2C_RX_UNDER,I2C_RX_OVER,I2C_RX_FULL,I2C_TX_OVER
|
||||
// I2C_TX_EMPTY,I2C_RD_REQ,I2C_TX_ABRT,I2C_RX_DONE
|
||||
// I2C_INT_BUSY,I2C_STOP_DET,I2C_START_DET,I2C_GEN_CALL
|
||||
// I2C_RESTART_DET,I2C_MST_ON_HOLD,I2C_SCL_SLOW
|
||||
//NewState:ENABLE/DISABLE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_ConfigInterrupt_CMD(FunctionalStatus NewState,U32_T INT_TYPE)
|
||||
{
|
||||
if(NewState != DISABLE)
|
||||
{
|
||||
I2C0->IMSCR |= INT_TYPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
I2C0->IMSCR &= (~INT_TYPE);
|
||||
}
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C FIFO trigger data
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_FIFO_TriggerData(U16_T RX_FLSEL,U16_T TX_FLSEL)
|
||||
{
|
||||
I2C0->RX_FLSEL = RX_FLSEL;
|
||||
I2C0->TX_FLSEL = TX_FLSEL;
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C Stop
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Stop(void)
|
||||
{
|
||||
I2C0->DATA_CMD = (I2C0->DATA_CMD&0XFFFFFDFF)|I2C_CMD_STOP; //Enable I2C
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C enable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Enable(void)
|
||||
{
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFFE)|I2C_ENABLE; //Enable I2C
|
||||
while((I2C0->STATUS&0x1000)!=0x1000);
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C disable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Disable(void)
|
||||
{
|
||||
I2C0->ENABLE =(I2C0->ENABLE&0XFFFFFFFE)|I2C_DISABLE; //Disable I2C
|
||||
while((I2C0->STATUS&0x1000)==0x1000);
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C Abort enable in master mode
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Abort_EN(void)
|
||||
{
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFFD)|I2C_ABORT; //Enable Abort
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C Abort status
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
U8_T I2C_Abort_Status(void)
|
||||
{
|
||||
uint8_t value = 0;
|
||||
uint32_t dat = 0;
|
||||
dat=(I2C0->ENABLE)&0x02;
|
||||
if (dat == 0x02)
|
||||
{
|
||||
value = 1; //aborting
|
||||
}
|
||||
return value; //no abort or abort over
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C RECOVER enable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_SDA_Recover_EN(void)
|
||||
{
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFF7)|I2C_SDA_REC_EN; //Enable Recover Enable
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C RECOVER enable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_SDA_Recover_DIS(void)
|
||||
{
|
||||
I2C0->ENABLE = (I2C0->ENABLE&0XFFFFFFF7)|I2C_SDA_REC_DIS; //Enable Recover Disable
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C Interrupt enable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Int_Enable(void)
|
||||
{
|
||||
INTC_ISER_WRITE(I2C_INT); //Enable I2C interrupt
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C Interrupt disable
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Int_Disable(void)
|
||||
{
|
||||
INTC_ICER_WRITE(I2C_INT); //Disable I2C interrupt
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C WRITE OneByte
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_WRITE_Byte(U8_T write_adds,U8_T i2c_data)
|
||||
{
|
||||
U16_T R_EEROR_CONT=0;
|
||||
|
||||
I2C0->DATA_CMD = I2C_CMD_WRITE|write_adds ;
|
||||
I2C0->DATA_CMD = i2c_data |I2C_CMD_STOP;
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
I2C_Disable();
|
||||
I2C_Enable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_BUSY) != I2C_BUSY ); //Wait for FSM working
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
I2C_Disable();
|
||||
I2C_Enable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(((I2C0->STATUS) & I2C_TFE) != I2C_TFE);
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C WRITE nByte
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_WRITE_nByte(U8_T write_adds,volatile U8_T *i2c_data,U8_T NumByteToWrite)
|
||||
{
|
||||
U16_T R_EEROR_CONT=0;
|
||||
U8_T i;
|
||||
I2C0->DATA_CMD = I2C_CMD_WRITE|write_adds ;
|
||||
for(i=0;i<NumByteToWrite;i++)
|
||||
{
|
||||
if(i>=NumByteToWrite-1)
|
||||
{
|
||||
I2C0->DATA_CMD = *(i2c_data+i) |I2C_CMD_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
I2C0->DATA_CMD = *(i2c_data+i);
|
||||
}
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
I2C_Disable();
|
||||
I2C_Enable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_BUSY) != I2C_BUSY ); //Wait for FSM working
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
I2C_Disable();
|
||||
I2C_Enable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(((I2C0->STATUS) & I2C_TFNF) != I2C_TFNF);
|
||||
}
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C READ OneByte
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
U8_T I2C_READ_Byte(U8_T read_adds)
|
||||
{
|
||||
U8_T value;
|
||||
U16_T R_EEROR_CONT=0;
|
||||
I2C0->DATA_CMD = I2C_CMD_WRITE|read_adds|I2C_CMD_RESTART1;
|
||||
I2C0->DATA_CMD = I2C_CMD_READ |I2C_CMD_STOP;
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_BUSY) != I2C_BUSY ); //Wait for FSM working
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_RFNE) != I2C_RFNE ); //Wait for RX done
|
||||
value=I2C0->DATA_CMD &0XFF;
|
||||
return value;
|
||||
}
|
||||
/*************************************************************/
|
||||
//I2C READ nByte
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_READ_nByte(U8_T read_adds,volatile U8_T *i2c_data,U8_T NumByteToWrite)
|
||||
{
|
||||
U16_T R_EEROR_CONT=0;
|
||||
U8_T i;
|
||||
I2C0->DATA_CMD = I2C_CMD_WRITE|read_adds|I2C_CMD_RESTART1;
|
||||
for(i=0;i<NumByteToWrite;i++)
|
||||
{
|
||||
if(i>=NumByteToWrite-1)
|
||||
{
|
||||
I2C0->DATA_CMD = I2C_CMD_READ |I2C_CMD_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
I2C0->DATA_CMD = I2C_CMD_READ;
|
||||
}
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_BUSY) != I2C_BUSY ); //Wait for FSM working
|
||||
do
|
||||
{
|
||||
if(R_EEROR_CONT++>=10000)
|
||||
{
|
||||
R_EEROR_CONT=0;
|
||||
f_ERROR=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while( (I2C0->STATUS & I2C_RFNE) != I2C_RFNE ); //Wait for RX done
|
||||
*(i2c_data+i)=I2C0->DATA_CMD &0XFF;
|
||||
}
|
||||
}
|
||||
U16_T R_READ_BUF=0;
|
||||
/*************************************************************/
|
||||
//I2C slave Receive
|
||||
//EntryParameter:NONE
|
||||
//ReturnValue:NONE
|
||||
/*************************************************************/
|
||||
void I2C_Slave_Receive(void)
|
||||
{
|
||||
|
||||
if(!(((I2C0->MISR&I2C_SCL_SLOW)==I2C_SCL_SLOW)
|
||||
||((I2C0->MISR&I2C_TX_ABRT)==I2C_TX_ABRT))) //IIC is aborted when sclk locked))
|
||||
{
|
||||
if((I2C0->MISR&I2C_RX_FULL)==I2C_RX_FULL) //Data received?
|
||||
{
|
||||
if(RdIndex==0)
|
||||
{
|
||||
RdIndex=1;
|
||||
I2C_Data_Adress=I2C0->DATA_CMD&0XFF;
|
||||
I2C_St_Adress=I2C_Data_Adress;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(I2C_Data_Adress<BUFSIZE)
|
||||
{
|
||||
I2CRdBuffer[I2C_Data_Adress]= I2C0->DATA_CMD&0XFF;
|
||||
}
|
||||
I2C_Data_Adress++;
|
||||
}
|
||||
I2C0->ICR = I2C_RX_FULL;
|
||||
R_IIC_ERROR_CONT=0;
|
||||
}
|
||||
|
||||
if((I2C0->MISR&I2C_RD_REQ)==I2C_RD_REQ) //Read request generated
|
||||
{
|
||||
if(RdIndex==1)
|
||||
{
|
||||
RdIndex=2;
|
||||
WrIndex = I2C_St_Adress;
|
||||
//I2C_ConfigInterrupt_CMD(ENABLE,I2C_TX_EMPTY);
|
||||
if(WrIndex<BUFSIZE)
|
||||
{
|
||||
I2C0->DATA_CMD= (I2C0->DATA_CMD&0XFFFFFF00) |I2CWrBuffer[WrIndex];
|
||||
}
|
||||
}
|
||||
I2C0->ICR = I2C_RD_REQ;
|
||||
R_IIC_ERROR_CONT=0;
|
||||
}
|
||||
|
||||
if((I2C0->MISR&I2C_TX_EMPTY)==I2C_TX_EMPTY) //IIC send empty
|
||||
{
|
||||
if(RdIndex==2)
|
||||
{
|
||||
if(WrIndex+1<BUFSIZE)
|
||||
{
|
||||
I2C0->DATA_CMD= (I2C0->DATA_CMD&0XFFFFFF00) |I2CWrBuffer[WrIndex+1];
|
||||
}
|
||||
WrIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(R_IIC_ERROR_CONT>10000)
|
||||
{
|
||||
I2C_Disable();
|
||||
I2C0->DATA_CMD= (I2C0->DATA_CMD&0XFFFFFF00);
|
||||
I2C_SLAVE_CONFIG();
|
||||
R_IIC_ERROR_CONT=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
R_IIC_ERROR_CONT++;
|
||||
}
|
||||
}
|
||||
I2C0->CR = I2C_TX_EMPTY;
|
||||
}
|
||||
|
||||
else if((I2C0->MISR&I2C_STOP_DET)==I2C_STOP_DET)
|
||||
{
|
||||
I2C0->ICR =I2C_STOP_DET;
|
||||
if(RdIndex!=0)
|
||||
{
|
||||
RdIndex=0;
|
||||
//I2C_ConfigInterrupt_CMD(DISABLE,I2C_TX_EMPTY);
|
||||
}
|
||||
R_READ_BUF=I2C0->DATA_CMD&0XFF;
|
||||
R_IIC_ERROR_CONT=0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
I2C_Disable();
|
||||
I2C0->DATA_CMD= (I2C0->DATA_CMD&0XFFFFFF00);
|
||||
I2C_SLAVE_CONFIG();
|
||||
RdIndex=0;
|
||||
//I2C_ConfigInterrupt_CMD(ENABLE,I2C_TX_EMPTY);
|
||||
I2C0->ICR = I2C_SCL_SLOW|I2C_TX_ABRT;
|
||||
R_IIC_ERROR_CONT=0;
|
||||
|
||||
}
|
||||
}
|
||||
/******************* (C) COPYRIGHT 2020 APT Chip *****END OF FILE****/
|
||||
Reference in New Issue
Block a user