📄 i2c1.c
字号:
** ERR_BUSOFF - Clock timeout elapsed or
** device cannot receive data
** ERR_RXEMPTY - No data in receiver (slave
** mode only)
** ERR_OVERRUN - Overrun error was detected
** from the last character or block
** received (slave mode only)
** ERR_ARBITR - Arbitration lost (only when
** interrupt service is disabled and in
** master mode)
** ERR_NOTAVAIL - Method is not available
** in current mode - see generated code
** comment
** ===================================================================
*/
/*
byte I2C1_RecvChar(byte *Chr)
** This method is implemented as a macro. See I2C1.h file. **
*/
/*
** ===================================================================
** Method : I2C1_SendBlock (bean InternalI2C)
**
** Description :
** When working as a MASTER, this method writes one (7-bit
** addressing) or two (10-bit addressing) slave address
** bytes inclusive of R/W bit = 0 to the I2C bus and then
** writes the block of characters to the bus. The slave
** address must be specified before, by the "SelectSlave" or
** "SlaveSelect10" method or in bean initialization section,
** "Target slave address init" property. If interrupt
** service is enabled and the method returns ERR_OK, it
** doesn't mean that transmission was successful. The state
** of transmission is detectable by means of events
** (OnTransmitData, OnError or OnArbitLost). Data to be send
** is not copied to an internal buffer and remains in the
** original location. Therefore the content of the buffer
** should not be changed until the transmission is complete.
** Event OnTransmitData can be used to detect the end of the
** transmission.
** When working as a SLAVE, this method writes a block of
** characters to the internal output slave buffer and then,
** after the master starts the communication, to the I2C bus.
** If no character is ready for a transmission (internal
** output slave buffer is empty), the "Empty character" will
** be sent (see "Empty character" property). In SLAVE mode
** the data are copied to an internal buffer, if specified
** by "Output buffer size" property.
** Parameters :
** NAME - DESCRIPTION
** * Ptr - Pointer to the block of data to send.
** Siz - Size of the block.
** * Snt - Amount of data sent (moved to a buffer).
** In master mode, if interrupt support is
** enabled, the parameter always returns
** the same value as the parameter 'Siz' of
** this method.
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_DISABLED - Device is disabled
** ERR_BUSY - The slave device is busy, it
** does not respond by the acknowledge
** (only in master mode and when interrupt
** service is disabled)
** ERR_BUSOFF - Clock timeout elapsed or
** device cannot transmit data
** ERR_TXFULL - Transmitter is full. Some
** data has not been sent. (slave mode only)
** ERR_ARBITR - Arbitration lost (only when
** interrupt service is disabled and in
** master mode)
** ===================================================================
*/
byte I2C1_SendBlock(void * Ptr,word Siz,word *Snt)
{
if (!Siz) { /* Test variable Size on zero */
*Snt = 0;
return ERR_OK; /* If zero then OK */
}
if((IICS_BUSY)||(InpLenM)||(I2C1_SerFlag&(CHAR_IN_TX|WAIT_RX_CHAR|IN_PROGRES))) { /* Is the bus busy */
return ERR_BUSOFF; /* If yes then error */
}
EnterCritical(); /* Enter the critical section */
I2C1_SerFlag |= IN_PROGRES; /* Set flag "busy" */
OutLenM = Siz; /* Set lenght of data */
OutPtrM = (byte *)Ptr; /* Save pointer to data for transmitting */
IICC1_TX = 1; /* Set TX mode */
if(IICC1_MST) { /* Is device in master mode? */
IICC1_RSTA = 1; /* If yes then repeat start cycle generated */
}
else {
IICC1_MST = 1; /* If no then start signal generated */
}
IICD = I2C1_SlaveAddr; /* Send slave address */
ExitCritical(); /* Exit the critical section */
*Snt = Siz; /* Dummy number of really sent chars */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : I2C1_RecvBlock (bean InternalI2C)
**
** Description :
** When working as a MASTER, this method writes one (7-bit
** addressing) or two (10-bit addressing) slave address
** bytes inclusive of R/W bit = 1 to the I2C bus, then reads
** the block of characters from the bus and then sends the
** stop condition. The slave address must be specified
** before, by the "SelectSlave" or "SelectSlave10" method or
** in bean initialization section, "Target slave address
** init" property. If interrupt service is enabled and the
** method returns ERR_OK, it doesn't mean that transmission
** was finished successfully. The state of transmission must
** be tested by means of events (OnReceiveData, OnError or
** OnArbitLost). In case of successful transmission,
** received data is ready after OnReceiveData event is
** called.
** When working as a SLAVE, this method reads a block of
** characters from the input slave buffer.
** Parameters :
** NAME - DESCRIPTION
** * Ptr - A pointer to the block space for
** received data.
** Siz - The size of the block.
** * Rcv - Amount of received data. In master mode,
** if interrupt support is enabled, the
** parameter always returns the same value
** as the parameter 'Siz' of this method.
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_DISABLED - Device is disabled
** ERR_BUSY - The slave device is busy, it
** does not respond by an acknowledge (only
** in master mode and when interrupt
** service is disabled)
** ERR_BUSOFF - Clock timeout elapsed or
** device cannot receive data
** ERR_RXEMPTY - The receive buffer didn't
** contain the requested number of data.
** Only available data (or no data) has
** been returned (slave mode only).
** ERR_OVERRUN - Overrun error was detected
** from last character or block receiving
** (slave mode only)
** ERR_ARBITR - Arbitration lost (only when
** interrupt service is disabled and in
** master mode)
** ===================================================================
*/
byte I2C1_RecvBlock(void* Ptr,word Siz,word *Rcv)
{
if (!Siz) { /* Test variable Size on zero */
*Rcv = 0;
return ERR_OK; /* If zero then OK */
}
if((IICS_BUSY)||(InpLenM)||(I2C1_SerFlag&(CHAR_IN_TX|WAIT_RX_CHAR|IN_PROGRES))) { /* Is the bus busy */
return ERR_BUSOFF; /* If yes then error */
}
EnterCritical(); /* Enter the critical section */
InpLenM = Siz; /* Set lenght of data */
InpPtrM = (byte *)Ptr; /* Save pointer to data for reception */
IICC1_TX = 1; /* Set TX mode */
if(IICC1_MST) { /* Is device in master mode? */
IICC1_RSTA = 1; /* If yes then repeat start cycle generated */
}
else {
IICC1_MST = 1; /* If no then start signal generated */
}
IICD = (byte)(I2C1_SlaveAddr+1); /* Send slave address */
ExitCritical(); /* Exit the critical section */
*Rcv = Siz; /* Dummy number of really received chars */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : I2C1_GetCharsInTxBuf (bean InternalI2C)
**
** Description :
** Returns number of characters in the output buffer. In
** SLAVE mode returns the number of characters in the
** internal slave output buffer. In MASTER mode returns
** number of characters to be sent from the user buffer
** (passed by SendBlock method).
** This method is not supported in polling mode.
** Parameters : None
** Returns :
** --- - Number of characters in the output
** buffer.
** ===================================================================
*/
word I2C1_GetCharsInTxBuf(void)
{
return(OutLenM); /* Return number of chars remaining in the Master Tx buffer */
}
/*
** ===================================================================
** Method : I2C1_GetCharsInRxBuf (bean InternalI2C)
**
** Description :
** Returns number of characters in the input buffer. In
** SLAVE mode returns the number of characters in the
** internal slave input buffer. In MASTER mode returns
** number of characters to be received into a user buffer
** (passed by RecvChar or RecvBlock method).
** This method is not supported in polling mode.
** Parameters : None
** Returns :
** --- - Number of characters in the input
** buffer.
** ===================================================================
*/
word I2C1_GetCharsInRxBuf(void)
{
return(InpLenM); /* Return number of chars remaining in the Master Tx buffer */
}
/*
** ===================================================================
** Method : I2C1_SelectSlave (bean InternalI2C)
**
** Description :
** This method selects a new slave for communication by its
** 7-bit slave address value. Any send or receive method
** directs to or from selected device, until a new slave
** device is selected by this method. This method is not
** available for the SLAVE mode.
** Parameters :
** NAME - DESCRIPTION
** Slv - 7-bit slave address value.
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_BUSY - The device is busy, wait
** until the current operation is finished.
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_DISABLED - The device is disabled
** ===================================================================
*/
byte I2C1_SelectSlave(byte Slv)
{
if (IICC1_MST == 1) { /* Is the device in the active state? */
return ERR_BUSY; /* If yes then error */
}
I2C1_SlaveAddr = (byte)(Slv << 1); /* Set slave address */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : I2C1_Init (bean InternalI2C)
**
** Description :
** Initializes the associated peripheral(s) and the bean internal
** variables. The method is called automatically as a part of the
** application initialization code.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void I2C1_Init(void)
{
I2C1_SerFlag = 0x80; /* Reset all flags */
I2C1_SlaveAddr = 0x10; /* Set variable for slave address */
/* IICF: MULT1=0,MULT0=1,ICR5=0,ICR4=0,ICR3=0,ICR2=0,ICR1=0,ICR0=0 */
setReg8(IICF, 0x40);
IICC1_IICEN = 1; /* Enable device */
/* IICC1: IICEN=1,IICIE=1,MST=0,TX=0,TXAK=0,RSTA=0,??=0,??=0 */
IICC1 = 0xC0; /* Control register settings */
}
/* END I2C1. */
/*
** ###################################################################
**
** This file was created by UNIS Processor Expert 3.03 [04.07]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -