完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前是用C8051F340来驱动这个ADXL345的。没问题。 现在想把这个程序移植到STM32上。可是就是不行。 /************************************** 起始信号 **************************************/ void Start(void) { SDA_OUT(); Set_IIC_SDA; //拉高数据线 Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 Clr_IIC_SDA; //产生下降沿 Delay5us(); //延时 Clr_IIC_SCL; //拉低时钟线 } /************************************** 停止信号 **************************************/ void Stop(void) { SDA_OUT(); Clr_IIC_SDA; //拉低数据线 Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 Set_IIC_SDA; //产生上升沿 Delay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void SendACK(unsigned char ack) { SDA_OUT(); if(ack) { Set_IIC_SDA; //写应答信号 } else { Clr_IIC_SDA; } Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 Clr_IIC_SCL; //拉低时钟线 Delay5us(); //延时 } /************************************** 接收应答信号 **************************************/ unsigned char RecvACK(void) { unsigned char CY; SDA_IN(); Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 CY = READ_SDA; //读应答信号 Clr_IIC_SCL; //拉低时钟线 Delay5us(); //延时 return CY; } /************************************** 向IIC总线发送一个字节数据 **************************************/ void SendByte(BYTE dat) { BYTE i; SDA_OUT(); for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 if(dat&0x80) {Set_IIC_SDA;} //送数据口 else {Clr_IIC_SDA;} Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 Clr_IIC_SCL; //拉低时钟线 Delay5us(); //延时 } RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ BYTE RecvByte() { BYTE i; BYTE dat = 0; SDA_OUT(); Set_IIC_SDA; //使能内部上拉,准备读取数据, SDA_IN(); for (i=0; i<8; i++) //8位计数器 { dat <<= 1; Set_IIC_SCL; //拉高时钟线 Delay5us(); //延时 dat |= READ_SDA; //读数据 Clr_IIC_SCL; //拉低时钟线 Delay5us(); //延时 } return dat; } //******单字节写入******************************************* void Single_Write(unsigned char REG_Address,unsigned char REG_data,unsigned char SlaveAddress) { Start(); //起始信号 SendByte(SlaveAddress); //发送设备地址+写信号 SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页 Stop(); //发送停止信号 } //********单字节读取***************************************** //uchar Single_Read(uchar REG_Address,uchar SlaveAddress) //{ uchar REG_data; // Start(); //起始信号 // SendByte(SlaveAddress); //发送设备地址+写信号 // SendByte(REG_Address); //发送存储单元地址,从0开始 // Start(); //起始信号 // SendByte(SlaveAddress+1); //发送设备地址+读信号 // REG_data=RecvByte(); //读出寄存器数据 // SendACK(1); // Stop(); //停止信号 // return REG_data; //} //********************************************************* // //连续读出ADXL345内部加速度数据,地址范围0x32~0x37 // //********************************************************* void Multiple_read(unsigned char SlaveAddress) { unsigned char i; Start(); //起始信号 SendByte(SlaveAddress); //发送设备地址+写信号 if(SlaveAddress==ADXL345_SlaveAddress) { SendByte(0x32); //发送存储单元地址,从0x32开始 } else { SendByte(0x03); } Start(); //起始信号 SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF = RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 5) { SendACK(1); //最后一个数据需要回NOACK } else { SendACK(0); //回应ACK } } Stop(); //停止信号 Delay5ms(); } //***************************************************************** //初始化ADXL345,根据需要请参考pdf进行修改************************ void Init_ADXL345() { Single_Write(0x31,0x0b,ADXL345_SlaveAddress); //测量范围,正负16g,13位模式 Single_Write(0x2C,0x08,ADXL345_SlaveAddress); //速率设定为12.5 参考pdf13页 Single_Write(0x2D,0x08,ADXL345_SlaveAddress); //选择电源模式 参考pdf24页 Single_Write(0x2E,0x80,ADXL345_SlaveAddress); //使能 DATA_READY 中断 Single_Write(0x1E,0x00,ADXL345_SlaveAddress); //X 偏移量 根据测试传感器的状态写入pdf29页 Single_Write(0x1F,0x00,ADXL345_SlaveAddress); //Y 偏移量 根据测试传感器的状态写入pdf29页 Single_Write(0x20,0x05,ADXL345_SlaveAddress); //Z 偏移量 根据测试传感器的状态写入pdf29页 } 楼主的这个问题最终成功解决,他的经验是:提醒各位从8位过度到32位单片机时,千万要注意数据位的变化,比如INT型从原来的16位变成32位。还有就是注意没有双向口时,需要切换IO的输入输出方向。而且要注意切换的时间点。不然会造成IIC上有毛刺,导致通讯不成功。介个,估计很多亲不会注意到,值得学习借鉴! |
|
相关推荐
1个回答
|
|
感谢楼主分享
|
|
|
|
只有小组成员才能发言,加入小组>>
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1700 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4094 浏览 2 评论
8802 浏览 1 评论
3020 浏览 1 评论
6935 浏览 2 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1153浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1451浏览 2评论
1372浏览 2评论
1123浏览 1评论
995浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 14:16 , Processed in 1.101840 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191