📄 i2cint.c
字号:
#include "config.h"
volatile uint8 I2C_sla ;
volatile uint32 I2C_suba ;
volatile uint8 I2C_suba_num ;
volatile uint8 *I2C_buf ;
volatile uint32 I2C_num ;
volatile uint8 I2C_end ;
volatile uint8 I2C_suba_en ;
uint8 ISendByte(uint8 sla , uint8 dat)
{
I2C_sla = sla ;
I2C_buf = &dat;
I2C_num = 1;
I2C_suba_en = 0;
I2C_end = 0;
I2CONCLR = 0x2C ;
I2CONSET = 0x60 ;
while(I2C_end == 0) ;
if(I2C_end == 1)
return (1);
else
return (0);
}
uint8 IRecByte(uint8 sla , uint8 *dat)
{
I2C_sla = sla + 1;
I2C_buf = dat;
I2C_num = 1;
I2C_suba_en = 0;
I2C_end = 0;
I2CONCLR = 0x2C ;
I2CONSET = 0x60 ;
while(I2C_end == 0) ;
if(I2C_end == 1)
return (1);
else
return (0);
}
uint8 I2C_ReadNByte(uint8 sla , uint32 suba_type , uint32 suba , uint8 *s,uint32 num)
{
if(num > 0)
{
if(suba_type == 1)
{
I2C_sla = sla + 1;
I2C_suba = suba ; // uint32
I2C_suba_num = 1;
}
else if(suba_type == 2)
{
I2C_sla = sla + 1;
I2C_suba = suba ;
I2C_suba_num = 2;
}
I2C_buf = s ;
I2C_num = num ;
I2C_suba_en = 1 ;
I2C_end = 0 ;
I2CONCLR = (1<<2) | (1<<3) | (1<<5) ;
I2CONSET = (1<<5) | (1<<6) ;
while(I2C_end == 0) ;
if(I2C_end == 1)
return TRUE ;
else
return FALSE ;
}
return FALSE ;
}
uint8 I2C_WriteNByte(uint8 sla , uint8 suba_type ,uint32 suba ,uint8 *s, uint32 num)
{
if(num > 0)
{
if(suba_type == 1)
{
I2C_sla = sla ;
I2C_suba = suba ; // uint32
I2C_suba_num = 1;
}
else if(suba_type == 2)
{
I2C_sla = sla ;
I2C_suba = suba ;
I2C_suba_num = 2;
}
I2C_buf = s ;
I2C_num = num ;
I2C_suba_en = 2 ;
I2C_end = 0;
I2CONCLR = (1<<2) | (1<<3) | (1<<5) ;
I2CONSET = (1<<5) | (1<<6) ;
while(I2C_end == 0) ;
if(I2C_end == 1)
return (TRUE) ;
else
return (FALSE) ;
}
return (FALSE) ;
}
void __irq IRQ_I2C(void)
{
switch(I2STAT & 0xF8)
{
case 0x08 :
if(I2C_suba_en == 1)
{
I2DAT = I2C_sla & 0xFE ;
}
else
{
I2DAT = I2C_sla ;
}
I2CONCLR = (1<<3) | (1<<5) ;
break;
case 0x10:
I2DAT = I2C_sla;
I2CONCLR = 0x28 ;
break;
case 0x18:
case 0x28:
if(I2C_suba_en == 0)
{
if(I2C_num >0)
{
I2DAT = *I2C_buf++;
I2CONCLR = 0x28 ;
I2C_num--;
}
else
{
I2CONSET = (1<<4);
I2CONCLR = 0x28 ;
I2C_end = 1;
}
}
else if(I2C_suba_en == 1)
{
if(I2C_suba_num == 2)
{
I2DAT = ((I2C_suba >>8 ) & 0xFF) ;
I2CONCLR = 0x28;
I2C_suba_num--;
break;
}
if(I2C_suba_num == 1)
{
I2DAT = (I2C_suba &0xFF);
I2CONCLR = 0x28;
I2C_suba_num--;
break;
}
if(I2C_suba_num == 0)
{
I2CONSET = 0x20 ;
I2CONCLR = 0x08;
I2C_suba_en = 0;
break;
}
}
else if(I2C_suba_en == 2)
{
if(I2C_suba_num >0)
{
if(I2C_suba_num == 2)
{
I2DAT = ((I2C_suba >>8 ) & 0xFF) ;
I2CONCLR = 0x28;
I2C_suba_num--;
break;
}
if(I2C_suba_num == 1)
{
I2DAT = (I2C_suba &0xFF);
I2CONCLR = 0x28;
I2C_suba_num--;
I2C_suba_en = 0;
break;
}
}
}
break;
case 0x40:
if(I2C_num <= 1)
{
I2CONCLR = 1 << 2;
}
else
{
I2CONSET = 1 << 2;
}
I2CONCLR = 0x28;
break;
case 0x20 :
case 0x30:
case 0x38:
case 0x48:
I2CONCLR = 0x28;
I2C_end = 0xFF;
break;
case 0x50:
*I2C_buf++ = I2DAT ;
I2C_num--;
if(I2C_num == 1)
I2CONCLR = 0x2C ;
else
{
I2CONSET = 0x04;
I2CONCLR = 0x28;
}
break;
case 0x58:
*I2C_buf++ = I2DAT ;
I2CONSET = 0x10;
I2CONCLR = 0x28;
I2C_end = 1;
break;
default :
break;
}
VICVectAddr = 0x00;
}
/*
*********************************************************************************************************
** 函数名称 :I2cInit()
** 函数功能 :I2C初始化
** 入口参数 :Fi2c I2C总线频率(最大400K)
** 出口参数 :无
*********************************************************************************************************
*/
void I2CInit(uint32 Fi2c)
{
if(Fi2c > 400000)
Fi2c = 400000;
PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50;
I2SCLH = (Fpclk / Fi2c + 1)/2;
I2SCLL = (Fpclk / Fi2c )/2;
I2CONCLR = 0x2C ;
I2CONSET = 0x40;
VICIntSelect = 0x00000000;
VICVectCntl9 = (0x20 | 0x09);
VICVectAddr9 = (uint32)IRQ_I2C;
VICIntEnable = (1<<9);
/* 使能I2C中断 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -