📄 threepigm.c
字号:
/*/////////////////////////////////
// 函数名:IIC通信函数 //
// 函数功能:初始化IIC //
// 函数参数:空 //
/////////////////////////////////*/
void iic_init()
{
IIC2.ICCR1.BIT.ICE=1; //IIC总线模式
IIC2.ICCR1.BIT.CKS=0x2; //通信协议,每个芯片要一直
IIC2.ICMR.BIT.MLS=0; //必须这样设置
IIC2.ICMR.BIT.WAIT=1; //主模式下该寄存器才有效
IIC2.ICMR.BIT.BCWP=0;
IIC2.ICMR.BIT.BC=0x0; //由0xf改成
IIC2.ICIER.BIT.ACKBT=0;
IIC2.SAR.BYTE=0xC8;
}
/*/////////////////////////////////
// 函数名:IIC通信函数 //
// 函数功能:等待数据状态初始化 //
// 函数参数:空 //
/////////////////////////////////*/
void iic_c_get_init()
{
IIC2.ICCR1.BIT.MST=0;
IIC2.ICCR1.BIT.TRS=0;
}
/*/////////////////////////////////
// 函数名:IIC通信函数 //
// 函数功能:发送数据 //
// 函数参数:address(对方地址)//
// dat[](数据地址) //
/////////////////////////////////*/
unsigned char iic_z_send(unsigned char address,unsigned char dat[])
{
unsigned char n=0,m=0,t=1;
if(IIC2.ICCR2.BIT.BBSY==0)
{
IIC2.ICCR1.BIT.MST=1;
IIC2.ICCR1.BIT.TRS=1;
IIC2.ICCR2.BYTE=0xBD; //必须使用MOV指令
IIC2.ICDRT=address;
while(IIC2.ICSR.BIT.TEND==0)
;
for(m=0;m<50;m++)
;
if(IIC2.ICIER.BIT.ACKBR==0)
{
for(n=0;n<3;n++)
{
IIC2.ICDRT=dat[n];
while(IIC2.ICSR.BIT.TDRE==0);
}
while(IIC2.ICSR.BIT.TEND==0);
t=0;
}
IIC2.ICSR.BIT.TEND=0;
IIC2.ICSR.BIT.STOP=0;
IIC2.ICCR2.BYTE=0x3D; //必须使用MOV指令
iic_init();
iic_c_get_init();
}
return t;
}
/*/////////////////////////////////
// 函数名:IIC通信函数 //
// 函数功能:接收数据 //
// 函数参数:dat[](存数据地址)//
/////////////////////////////////*/
void iic_c_get(unsigned char dat[])
{
unsigned char t,n;
if(IIC2.ICSR.BIT.AAS==1)
{
IIC2.ICSR.BIT.AAS=0;
IIC2.ICIER.BIT.ACKBT=0; //接收应答
t=IIC2.ICDRR;
for(n=0;n<3;n++)
{
while(IIC2.ICSR.BIT.RDRF==0);
dat[n]=IIC2.ICDRR;
}
}
}
/*////////////////////////////////////////////
// 函数名:IIC安全发送函数 //
// 函数功能:实现发送数据,同时返回变量 //
// 函数参数:3个数据值,一个等待回复标志变量//
////////////////////////////////////////////*/
unsigned char iic_s_r(unsigned char dat,unsigned char dat0,unsigned char dat1,unsigned char dat2)
{
_sendDat[0]=dat0;
_sendDat[1]=dat1;
_sendDat[2]=dat2;
return iic_z_send(_addrDat[dat],_sendDat);
}
/*////////////////////////////////
// 函数名:IIC中断程序 //
// 函数功能:空 //
// 函数参数:空 //
////////////////////////////////*/
__interrupt(vect=24) void INT_IIC2(void)
{
IIC2.ICIER.BIT.RIE=0; //关闭中断
//保存电机控制变量防止撞死
if(INIT_finsh==1)
{
SMLEFT=0;
SMRIGHT=0;
TZ1.GRC=0;
TZ1.GRD=0;
}
iic_c_get(_getDat); //获取数据函数
IIC2.SAR.BYTE=0xD8; //更改地址
//
// 此处可进行数据操作
//
IIC2.ICIER.BIT.RIE=1; //开中断
IIC2.SAR.BYTE=0xC8; //恢复地址
}
void main()
{
AD.ADCSR.BYTE=0x07;
AD.ADCR.BYTE=0x00;
//IIC通信
iic_init();
iic_c_get_init();
IIC2.ICIER.BIT.RIE=1;
//发数据举例方法
while(iic_s_r(0x84/*此位为地址*/,0x88,0x11,0x11));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -