📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
char DATA,temp;
#define IIC_ERROR_STATUS 0
#define IIC_READY_STATUS 1
#define IIC_HEADER_SENT_STATUS 2
#define IIC_DATA_TRANSMISION_STATUS 3
#define IIC_DATA_SENT_STATUS 4
void WriteBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes);
void ReadBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes);
//---- I2C Variables -------------------------------------------------------
unsigned char I2C_STEP;
unsigned char I2C_DATA_DIRECTION = 0; /* 1 Transmit, 0 Read */
unsigned char I2C_LENGTH = 1;
unsigned char I2C_COUNTER = 0;
unsigned char I2C_DATA[20]; /* IIC Buffer */
void I2c_init(void)
{
/* Configure interfaces. Set our IIC adress. */
IICC_IICEN = 1; /* Enable IIC_module */
IICA =0xA4; /* IIC Address */
IICF = 0x9d; /* Set IIC frequency */
I2C_STEP = IIC_READY_STATUS;
IICC_IICIE = 0; /* Disable IIC_interrupts */
}
/********************************************************************************/
//
// 注意:写地址应为0,8,10,18,第个页的首地址,第次写8个字节(24c01类弄芯片)
//
/********************************************************************************/
void WriteBytesI2C(unsigned char slaveAddress,unsigned char numberOfBytes)
{
unsigned char Temp;
I2C_LENGTH = numberOfBytes;
I2C_COUNTER =0;
I2C_STEP = IIC_HEADER_SENT_STATUS;
I2C_DATA_DIRECTION = 1; //自定义变量,千万不要改动此变量,1为发送(写),0为接收(读)
/* Format the Address to fit in the IICA register and place a 0 on the R/W bit.*/
// slaveAddress &= 0xFE;
IICC_IICEN = 1; //始能模块
IICC_MST = 0;
IICC_TX = 1; /* Select Transmit Mode 发送,伴随着下面MST从0变1 */
IICC_MST = 1;
IICD = 0xa0; /* Send slave device selected address */
while(IICS_RXAK);
while(!IICS_IICIF);
Temp = IICS; /* 先读状态寄存器后写1Clear any pending interrupt*/
IICS_IICIF = 1;
IICD = slaveAddress;
while(IICS_RXAK);
IICC_IICIE=1;
return;
}
/**** read from IIc back function ***************/
void ReadBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes)
{
unsigned char Temp;
I2C_LENGTH = numberOfBytes;
I2C_COUNTER =0;
I2C_STEP = IIC_HEADER_SENT_STATUS;
I2C_DATA_DIRECTION = 0; //自定义变量,千万不要改动此变量,1为发送(写),0为接收(读)*/
IICC_MST = 1;
IICC_IICEN = 1; //始能模块
IICC_TX = 1; /* Select Transmit Mode 发送,伴随着下面MST从0变1 */
IICC_MST = 1; /* Select Master Mode (Send Start Bit) 主机模式 */
IICD = 0xa0; /* Send slave device selected address */
while(IICS_RXAK);
while(!IICS_IICIF);
Temp = IICS; /* 先读状态寄存器后写1Clear any pending interrupt*/
IICS_IICIF = 1;
IICD = slaveAddress;
while(IICS_RXAK);
while(!IICS_IICIF);
Temp = IICS; /* 先读状态寄存器后写1Clear any pending interrupt */
IICS_IICIF = 1;
IICC_RSTA=1; //重新启动
IICC_IICIE=1;
IICD = 0xa1;
return;
}
/* Interrupt handler routine to manage all the events related
* to the IIC module. */
interrupt 24 void Viic_isr(void)
{
unsigned char Temp;
//************************* 清除中断事件位 ********************************
Temp = IICS; /* ACK the interrupt */
IICS_IICIF = 1; //清除中断事件位/
//********************************************************/
if(IICS_ARBL==1) //=1,则总线总载失败/
{ /* Verify the Arbitration lost status */
IICS_ARBL= 1;
IICC_MST = 0;
I2C_STEP = IIC_ERROR_STATUS;
return;
} /* If Arbitration is OK continue */
//*************************************************************************//
if(IICC_MST==1) //如果为master模式.*/
{ /* If we are the IIC Master */
if(IICS_RXAK==1) //==1说明没有收到应答信号/
{
if(I2C_LENGTH ==I2C_COUNTER) return;
else
{
IICC_MST = 0;
I2C_STEP = IIC_ERROR_STATUS;
return; //没有收到从机的应答信号则返回*/
}
}
if(I2C_STEP == IIC_HEADER_SENT_STATUS) //如果上一个字节发的是命令字//
{ /* Header Sent */
IICC_TX = I2C_DATA_DIRECTION;
I2C_STEP = IIC_DATA_TRANSMISION_STATUS;
if(IICC_TX==0)
{ /* If we are reading data clock in first slave byte */
Temp = IICD;
return;
}
}
if(I2C_STEP == IIC_DATA_TRANSMISION_STATUS)
{ /* If byte transmision is in progress.*/
if(IICC_TX==1) //如果为写模式状态*************************
{
if(I2C_COUNTER>=I2C_LENGTH) //如果接收完毕,则进行以下操作
{
I2C_STEP=IIC_READY_STATUS; /* 复位I2C_STEP的状态=空闲状态Reset our status flag */
Temp = IICS; /* ACK the interrupt */
IICS_IICIF=1;
IICC_TX=0;
IICS_SRW=0;
while(IICS_RXAK);
IICC_MST=0; //see aw16.pdf P222 MST bit 说明,此操作将产生一个停止信号
return;
}
else
{
IICD =I2C_DATA[I2C_COUNTER]; /* Send the next byte */
I2C_COUNTER++;
}
}
else //否则为接收状态 *********************************
{
if((I2C_COUNTER+1)== I2C_LENGTH) /* Master should not ACK the last byte */
IICC_TXAK = 1; /* =1说明如果接收完.就不给从机发应答信号,否则自动发送应答信号!!!*/
I2C_DATA[I2C_COUNTER] = IICD; /* Read the next byte */
I2C_COUNTER++;
if(I2C_LENGTH ==I2C_COUNTER) //如果接收完毕,则进行以下操作
{
IICC_MST=0; //see aw16.pdf P222 MST bit 说明,此操作将产生一个停止信号
I2C_STEP=IIC_READY_STATUS; /* 复位I2C_STEP的状态=空闲状态Reset our status flag */
Temp = IICS; /* ACK the interrupt */
IICS_IICIF=1;
IICC_TX=0;
IICS_SRW=0;
IICC_IICIE=0 ; /* Mark we are done sending Bytes */
IICC_IICEN = 0;
return;
}
}
}
}
if(IICC_MST==0) /*************************************************************/
{ /* 如果为从模式(接收)as slve mode */
if(I2C_STEP <= IIC_READY_STATUS)
{ /* If it is the first byte tranmited */
I2C_STEP = IIC_DATA_TRANSMISION_STATUS;
IICC_TX = IICS_SRW; /* Set the transmision reception status */
I2C_COUNTER = 1;
/* If we are receiving data read IICD to get free bus and get the next byte */
if(IICC_TX==0)
{
Temp = IICD;
return;
}
}
if(IICS_TCF==1)
{
if(IICC_TX == 0)
{ /* If data is received store it on the buffer */
I2C_DATA[I2C_COUNTER]=IICD;
I2C_COUNTER++;
return;
}
else
{ /* Data sent by the slave */
if(IICS_RXAK==1)
{ /* If byte is not ACK end transmision. */
IICC_TX = 0;
Temp = IICD;
I2C_STEP = IIC_READY_STATUS;
return;
}
IICD = I2C_DATA[I2C_COUNTER];
I2C_COUNTER++;
return;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -