📄 i2c.c
字号:
UiMR = 0x02; // Enable IIC mode, internal clock
UiC1 = 0x10; // Transmit/Receive disable
UiSMR2 = 0x02; // UART init. disable,Clock sync. enable
UiSMR4 = 0x71; // Start condition generate (STSPSEL=0/STAREQ=1)
UiSMR4 = 0x09; // STSP output enable (STSPSEL=1/STAREQ=1)
return TRUE;
}
// ---------------------------------------------------------------------------
// Adjust bus speed of I睠 line
// Uses defines : I2C_75_KB_SPEED ==> I2C_400_KB_SPEED
// ---------------------------------------------------------------------------
// Input Parameters :
// 1- Baud rate
// ---------------------------------------------------------------------------
// Returned Parameters :
// TRUE or FALSE if data can be transmited
// ---------------------------------------------------------------------------
// Modified globales: None
// ---------------------------------------------------------------------------
void I2C_setSpeed(unsigned char baudRate)
{
UiBRG = baudRate;
}
// ---------------------------------------------------------------------------
// DMA1 Interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned Parameters : None
// ---------------------------------------------------------------------------
// Modified globales: None
// ---------------------------------------------------------------------------
#ifdef DMA1_USED
void DMA_interrupt(void){
if(slaveAddress.bit.rw==0)//Write mode ?
{
//Last data send, with ack ?
ACK_IC = RX_ACK_IPL; // ACK int. enable
DM1IC.BYTE = INT_DISABLE; //Disable DMA1 Interrupt
}
}
#endif
// ---------------------------------------------------------------------------
// UARTi ACK interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned Parameters : None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_ACK(void)
{
if(slaveAddress.bit.rw==1) //Read mode ?
{
if(readIndex!=0) //Address in receive register if readIndex==0
{
ptrReadData[readIndex-1] = (unsigned char)UiRB;
}
readIndex++;
//Continue transmission with FF (keep bus high)
if(readIndex==totalReadLength)//is next data last byte ?
UiTB = 0x01FF; // send NACK
else
UiTB = 0x00FF; // send ACK
}
else
{
if(writeIndex != writeLength) //Sent all bytes ?
{
UiTB = ptrWriteData[writeIndex];
writeIndex++;
}
else
{
//Continue transmission with FF (keep bus high)
if(writeIndex==writeLength)//is next data last byte ?
//This portion is generated ONLY on last data Transmit
UiSMR4 = 0x74; // SCL=SDA="H"
UiSMR4 = 0x0C; // Stop condition (STSPSEL=1/STPREQ=1)
}
}
}
// ---------------------------------------------------------------------------
// UARTi NACK interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned Parameters : None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_NACK(void)
{
currentStatus.bit.nack = TRUE;
UiSMR4 = 0x74; // SCL=SDA="H"
UiSMR4 = 0x0C; // Stop condition (STSPSEL=1/STPREQ=1)
ACK_IC = INT_DISABLE; // ACK int. disable
#ifdef DMA1_USED
DM1CON.BYTE = 0; // DMA1 disable (stop data transmission)
DM1IC.BYTE = INT_DISABLE; //Disable DMA1 Interrupt
#endif
if(slaveAddress.bit.rw==1)//Read mode ?
{
if(readIndex!=totalReadLength)
// Received NACK before end of reception.
currentStatus.bit.error = I2C_UNCOMPLETE_READ;
else
{
// Get last byte in receive buffer
ptrReadData[readIndex-1] = (unsigned char)UiRB;
}
}
else
{
// Illegal condition
currentStatus.bit.error = I2C_UNCOMPLETE_WRITE;
}
}
// ---------------------------------------------------------------------------
// UARTi Start / Stop Interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned Parameters : None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_StartStopDetection(void)
{
unsigned short temp = 0;
if(BusBusyFlag == 1)
{ // Start condition interrupt
UiC1 = 0x10; // Transfer/Receive enable
UiC1 = 0x15; // Transfer/Receive enable
UiMR = 0x02;
UiSMR4 = 0x00; // STSPSEL=0
temp = slaveAddress.byte; // Slave address set
temp |= 0x0100; // NACK data set
UiTB = temp; // Start 1st byte transfer
UiRB = 0; // Arbitration lost flag clear
NACK_IC = TX_NACK_IPL; // NACK interrupt
#ifdef DMA1_USED
if(slaveAddress.bit.rw==1)//Read mode ?
ACK_IC = RX_ACK_IPL; // ACK interrupt
#else
ACK_IC = RX_ACK_IPL; // ACK interrupt
#endif
}
else
{ // Stop condition interrupt
UiMR = 0x00; // port set(Purpose:TXFUL,TBFUL flag must be cleared when
// slave receive)
UiMR = 0x0a; // ext. clock sel
UiSMR2 = 0x10; //
UiSMR4 = 0x30; // ACK data output"H"
UiC1 = 0x15; // transfer/receive enable
ACK_IC = INT_DISABLE;
NACK_IC = INT_DISABLE;
if(currentStatus.bit.busy==TRUE)
{
currentStatus.bit.busy=FALSE;
}
}
}
// ---------------------------------------------------------------------------
// Get I睠 line status
// Uses defines
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned : I睠 status
// ---------------------------------------------------------------------------
// Modified globales: None
// ---------------------------------------------------------------------------
I2CStatus I2C_getStatus()
{
return currentStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -