OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12976|回复: 9

IIC不知哪里错了,硬件上实现不了,这个是加速度传感器,路过的看看啊

[复制链接]

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
发表于 2013-8-1 16:26:27 | 显示全部楼层 |阅读模式
#include "wangjunqiang.h"
#define uchar unsigned char
#define uint  unsigned int
//CS 接3.3V
#define sda PCout(6)              //I2C 时钟传送位
#define scl PCout(7)              //I2C 时钟传送位

//IO方向设置
#define SDA_IN()  {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=8<<6;}
#define SDA_OUT() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=3<<6;}

#define IIC_READ  0x1D      //定义读指令
#define IIC_WRITE 0x1D      //定义写指令

uchar table1[16]=" MMA7455 X= 0.00"; //1602显示数据
uchar table2[16]=" Y= 0.00 Z= 0.00";
uchar table3[16]="No Find MMA7455!";
uchar table4[10]="0128345679";
uchar table5[8] =" MMA7455";
uchar table7[16]="Value:   X=0.50 ";

void iic_delay()        //5us延时
{
delay_us(5);
}

void delay_50us(uint t)
{
    uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}

void delay_50ms(uchar t)
{
    uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}

/*********************************************************************/
/**************               I2C通信部分              ***************/
/*********************************************************************/
void iic_start()               //函数功能:I2C通信开始
{
SDA_OUT();
sda=1;
    iic_delay();
scl=1;
    iic_delay();
sda=0;
iic_delay();
}

void iic_stop()                //函数功能:I2C通信停止
{
SDA_OUT();
sda=0;
iic_delay();
scl=1;
iic_delay();
sda=1;
iic_delay();
}

void iic_ack()                 //函数功能:I2C通信查应答位
{
    SDA_OUT();
sda=1;
scl=1;
iic_delay();
scl=0;   
}

void iic_write_byte(uchar wdata) //函数功能:向I2C从机写入一个字节
{
uchar i,temp,temp1;
SDA_OUT();
temp1=wdata;
for(i=0;i<8;i++)
{
scl = 0;
iic_delay();
temp=temp1;
temp=temp&0x80;
if(temp==0x80)
sda=1;
else
sda=0;
iic_delay();
scl=1;
iic_delay();
scl=0;
iic_delay();
temp1=temp1<<1;
}
}

char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节
{
uchar x;
char data_data;
SDA_IN();
for(x=0;x<8;x++)
{
data_data=data_data<<1;
sda=1;
iic_delay();
scl=0;
iic_delay();
scl=1;
iic_delay();
if(sda==1)
data_data|=0x01; 
}
return data_data;
}

void iic_write(uchar byte_add,uchar wdata) //函数功能:按地址写入一字节数据
{
     uchar t;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_write_byte(wdata);
iic_ack();
iic_stop();
}

char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据
{
     uchar t;
char x;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
t=((IIC_READ<<1)|0x01);
iic_start();
iic_write_byte(t);
iic_ack();
x=iic_read_byte();
iic_ack();
iic_stop();
return x;
}

/************************************************************************/
/*************               LED显示阵列部分               **************/
/************************************************************************/

char self_test7455(void) //函数功能:检测7455有没有插好
{ //          如果没有插好,1602将会显示
uchar j; // “No acceleration!"
char t;

delay_50us(10);
iic_write(0x16,0x05);
delay_50us(20);
t=iic_read(0x16);

if(t!=0x05)
{
write_1602_com(0x80);
for(j=0;j<16;j++)
{
   write_1602_dat(table3[j]);
delay_50us(10);
}
return 0;
}
return 1;
}
void Testinit1602()
{
char  j;
write_1602_com(0x80);
for(j=0;j<16;j++)
{
   write_1602_dat(table1[j]);
delay_50us(10);
}
write_1602_com(0x80+0x40);
for(j=0;j<16;j++)
{
   write_1602_dat(table2[j]);
delay_50us(10);
}
}

void sendx() //函数功能:向1602发送x轴测量数据
{
uchar x1,x2,x3,xsign;
char x;

x=iic_read(0x06);
if((x&0x80)==0x00)
{
xsign=0x2b;        //+
}
else
{
xsign=0x2d;        //-
x=x-0x01;
x=~x;
}

x1=(x/63);
x2=((x*100/63)%100)/10;
x3=(x*100/63)%10;

write_1602_com(0x8B);
write_1602_dat(xsign);
delay_50us(10);
write_1602_com(0x8C);
write_1602_dat(table4[x1]);
delay_50us(10);
write_1602_com(0x8E);
write_1602_dat(table4[x2]);
delay_50us(10);
write_1602_com(0x8F);
write_1602_dat(table4[x3]);
delay_50us(20);
}

void sendy() //函数功能:向1602发送y轴测量数据
{
uchar y1,y2,y3,ysign;
char y;

y=iic_read(0x07);
if((y&0x80)==0x00)
{
ysign=0x2b;        //+
}
else
{
ysign=0x2d;        //-
y=y-0x01;
y=~y;
}

y1=(y/63);
y2=((y*100/63)%100)/10;
y3=(y*100/63)%10;

write_1602_com(0xC3);
write_1602_dat(ysign);
delay_50us(10);
write_1602_com(0xC4);
write_1602_dat(table4[y1]);
delay_50us(10);
write_1602_com(0xC6);
write_1602_dat(table4[y2]);
delay_50us(10);
write_1602_com(0xC7);
write_1602_dat(table4[y3]);
delay_50us(20);
}

void sendz() //函数功能:向1602发送z轴测量数据
{
uchar z1,z2,z3,zsign;
char z;

z=iic_read(0x08);
if((z&0x80)==0x00)
{
zsign=0x2b;        //+
}
else
{
zsign=0x2d;        //-
z=z-0x01;
z=~z;
}

z1=(z/63);
z2=((z*100/63)%100)/10;
z3=(z*100/63)%10;

write_1602_com(0xCB);
write_1602_dat(zsign);
delay_50us(10);
write_1602_com(0xCC);
write_1602_dat(table4[z1]);
delay_50us(10);
write_1602_com(0xCE);
write_1602_dat(table4[z2]);
delay_50us(10);
write_1602_com(0xCF);
write_1602_dat(table4[z3]);
delay_50us(20);
}


int main(void)
{
uchar j;

Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化

LCD_Init();
lcd1602_init();
lcd_clear();

RCC->APB2ENR|=1<<4;    //使能PORTB时钟
GPIOC->CRL&=0X00FFFFFF; 
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=3<<6;
     

self_test7455();

iic_write(0x10,0x15);//校正X值
iic_write(0x12,0x25);//校正Y值
iic_write(0x14,0x10);//校正Z值

delay_50ms(2);

write_1602_com(0x80);
for(j=0;j<8;j++)
{
write_1602_dat(table5[j]);
delay_50us(10);
}

while(1)
{
//是否安插模块
if(1)
{
{
iic_write(0x10,0x15);//校正X值
iic_write(0x12,0x25);//校正Y值
iic_write(0x14,0x10);//校正Z值

delay_50ms(2);

write_1602_com(0x80);
for(j=0;j<8;j++)
{
write_1602_dat(table5[j]);
delay_50us(10);
}
Testinit1602();
//测试
 }
while(1)
{
if(1)
{
sendx();
//delay_50ms(1);
sendy();
//delay_50ms(1);
sendz();
delay_50ms(6);
}
else
break;
}
 }
}
}
原子哥,不知道IIC哪里错了,在51上可以实现的,端口不知怎么配置,原子哥,帮帮忙啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-1 22:01:21 | 显示全部楼层
回复【楼主位】王军强:
---------------------------------
建议你用我们的IIC例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-1 22:12:30 | 显示全部楼层
你的意思是IIC的读写用你们的?
我试过,好难调试啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-1 22:32:23 | 显示全部楼层
回复【3楼】王军强:
---------------------------------
不是吧,我认为我写的还是很精简了的啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-2 14:04:42 | 显示全部楼层
嗯嗯,废了大半天时间,终于搞好了
显示了3个方向的坐标数据,但是怎么转换为角度和加速度呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 14:18:59 | 显示全部楼层
回复【5楼】王军强:
---------------------------------
我们的ADXL345例程里面有换算函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-2 14:28:54 | 显示全部楼层
ADXL345例程,哪里有,我好像没有
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-2 14:36:54 | 显示全部楼层
原子哥,可不可以把那个换算函数复制给我看看啊,谢谢啊
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-2 14:46:33 | 显示全部楼层
我网上找的
Q=(float)data_xyz[0]*3.9;    //分别是加速度X,Y,Z的原始数据,10位的  
T=(float)data_xyz[1]*3.9;  
K=(float)data_xyz[2]*3.9; 
        
Roll=(float)(((atan2(K,Q)*180)/3.1416)-90);    //X轴角度值     
Pitch=(float)(((atan2(K,T)*180)/3.1416)-90);   //Y轴角度值  
zz=(float)((atan2(Q,K)*180)/3.1416);     //Z轴角度值
这里的data_xyz[0],data_xyz[1],data_xyz[2]是不是x,y,z的坐标数据啊?
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-2 17:15:22 | 显示全部楼层
解决了,哈哈哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 20:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表