中易网

哪位高手用过STM32模拟IIC和MPR121通信的程序

答案:1  悬赏:0  
解决时间 2021-10-04 17:25
哪位高手用过STM32模拟IIC和MPR121通信的程序
最佳答案
//刚开始记着将SCL 和SDA引脚定义为输出,并且将SDA输入使能:

//如:GPIOB->PIDR ^=1<<27;DDRH3=1;DDRH4=1;

#include "common.h"

#include "include.h"

//#include "iic.h"

#define uchar unsigned char

int dis_datax,dis_datay,dis_dataz;

int IIC_Receive[6];

uchar IIC_ERROR;

#define SCL_out PTC10_OUT //定义IIC时钟线输出高低IO2

#define SDA_out PTC11_OUT //定义IIC数据线输出高低IO3

#define SCL_in PTC10_IN //定义IIC时钟线输入

#define SDA_in PTC11_IN //定义IIC数据线输入

#define SCL_dir DDRC10 //定义时钟线方向寄存器

#define SDA_dir DDRC11 //定义数据线方向寄存器

#define READ 0xD2 //定义L3G4200DIIC地址

void Delay1us(u8 x)

{

u16 i;

for(i=0;i<64*x;i++);

}



void IIC_START()

{

SDA_out=1;

Delay1us(1);

SCL_out=1;

Delay1us(5);

SDA_out=0;

Delay1us(5);

SCL_out=0;

Delay1us(2);

}

void IIC_STOP()

{

SDA_out=0;

Delay1us(1);

SCL_out=1;

Delay1us(5);

SDA_out=1;

Delay1us(4);

}

void IIC_Send_ack()

{

SDA_out=1;

Delay1us(1);

SCL_out=1;

Delay1us(5);

SCL_out=0;

Delay1us(2);

}

void IIC_Check_ack()

{

Delay1us(3);

SCL_out=0;

Delay1us(3);

SDA_dir=0;

SDA_in=1;

Delay1us(3);

SCL_out=1;

Delay1us(5);

if(SDA_in==1)

IIC_ERROR=1;

else

IIC_ERROR=0;

SCL_out=0;

Delay1us(3);

SDA_dir=1;

}

//

void IIC_Send1byte(uchar data)

{

unsigned int i=8;

uchar m=data;

uchar temp;

for(i=8;i>0;i--)

{

temp=m&0x80;

if(temp==0x80)

SDA_out=1;

else

SDA_out=0;

Delay1us(5);

SCL_out=1;

Delay1us(5);

SCL_out=0;

m=m<<1;

}

}

//

uchar IIC_Receive1byte()

{

int i=8;

uchar j=0;

SDA_dir=0;

SDA_in=1;

for(i=8;i>0;i--)

{

SDA_in=1;

Delay1us(3);

SCL_out=1;

Delay1us(5);

if(SDA_in==1)

j=j|0x01;

else

j=j;

SCL_out=0;

if(i!=1)

{

j=j<<1;

}

}

SDA_dir=1;

return j;

}

// *****通过IIC总线向某一寄存器写入一个字节数据********

void IIC_write(uchar add,uchar mem,uchar data) // 写数据(器件地址,寄存器地址,数据)

{

IIC_START();

IIC_Send1byte(add);

IIC_Check_ack();

IIC_Send1byte(mem);

IIC_Check_ack();

IIC_Send1byte(data);

IIC_Check_ack();

IIC_STOP();

}

//

void L3G4200D_Init()

{

IIC_write(READ,0x20, 0x8F);

IIC_write(READ,0x21, 0x00);

IIC_write(READ,0x22, 0x08);

IIC_write(READ,0x23, 0x36 );

IIC_write(READ,0x24, 0x00);

}

int IIC_Read(uchar add,uchar mem) // 读数据(器件地址,寄存器地址)

{

int data;

IIC_START();

IIC_Send1byte(add);

IIC_Check_ack();

IIC_Send1byte(mem);

IIC_Check_ack();

IIC_START();

IIC_Send1byte(add+1);

IIC_Check_ack();

data=IIC_Receive1byte();

IIC_Send_ack();

IIC_STOP();

return data;

}

void GET_AngleSpeed()

{

IIC_Receive[0]=IIC_Read(READ,0x28); // x

IIC_Receive[1]=IIC_Read(READ,0x29); //

dis_datax=(IIC_Receive[1]<<8)+IIC_Receive[0];

IIC_Receive[2]=IIC_Read(READ,0x2A); // Y

IIC_Receive[3]=IIC_Read(READ,0x2B); //数据合成

dis_datay=(IIC_Receive[3]<<8)+IIC_Receive[2]; //因为经过了自检,初始后波形更好,但是不在0位

IIC_Receive[4]=IIC_Read(READ,0x2C); // Z

IIC_Receive[5]=IIC_Read(READ,0x2D); //

dis_dataz=(IIC_Receive[5]<<8)+IIC_Receive[4]; //

}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
南湖沙发材料商店地址谁知道?
diy复古项链的方法是什么?
洛阳哪里好吃的好玩的?
圆楼梯做法谁能介绍下?风水上有啥说法?
西昌红玛瑙是从哪里找的
请问广州品牌家政口碑哪家好
海南通什茶场(现五指山市茶场)到底是归哪里
皮肤问题
伊通县有什么好玩的
和平区公产房买产权需要多久,有谁知道呢?能
我初中学习成绩不好,上高中可以跟上吗?
安华坐便器报价多少
我这里是超市,用什么样的架子蔬菜夏天比较保
恩施来凤县安普罗食品公司的零号土猪肉武汉哪
杭州好美,想借着旅游业,开展自己的事业,想
推荐资讯
孕妇能水电褥子吗
江西玉山是怎样的地方?
什么是幽门螺旋
客厅沙发选择茶几尺寸?知道的给个报价过来
奉节县小寨天坑地缝与武隆县后坪天坑地缝的对
仙游中通快递在哪里
老年人应该怎样科学的补钙啊?
我是荣成农村的,房子没有房产证,如果村里开
你好,我想问下我老婆是肇东市的户口我是海林
出纳的凭证怎么该怎样做?
回收废锡渣在深圳哪家废品回收公司价高
要去日本旅游买什么好
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?