新手上路
积分 33
金钱 33
注册时间 2018-5-3
在线时间 26 小时
15 金钱
本人做毕业设计时,用到了JY-901这个模块用来测量姿态信息,参照IIC写了IIC程序,可是下载到板子上始终无反应,无法读取数据,想问下各位是什么原因,IIC的上拉电阻该如何配置?怎么才能读取JY-901
IIC通信得来的数据?使用use Simulator,或者ST-LINK哪个才能实现在线的硬件仿真,如何才能看到读取的IIC数据呢?
STM32F103的IIC接口电路
IIC连接管脚图
主要程序如下:
#include "iic901.h"
/JY-901的IIC驱动程序901iic.c和901iic.h/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//ÅäÖà B6 PB7 Îa¿a©êä3ö Ë¢DÂÆμÂêÎa10Mhz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//ó|óÃÅäÖÃμ½GPIOB
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //
SDA_OUT(); //sdaÏßêä3ö
IIC_SDA=1;
IIC_SCL=1;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: void IIC_Start(void)
*1|¡¡¡¡Äü: 2úéúIICÆeê¼DÅoÅ
*******************************************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßêä3ö
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: void IIC_Stop(void)
*1|¡¡¡¡Äü: //2úéúIICí£Ö1DÅoÅ
*******************************************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßêä3ö
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//·¢ËíI2C×üÏß½áêøDÅoÅ
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDAéèÖÃÎaêäèë
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//ê±Öóêä3ö0
return 0;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: void IIC_Ack(void)
*1|¡¡¡¡Äü: 2úéúACKó|′e
*******************************************************************************/
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: void IIC_NAck(void)
*1|¡¡¡¡Äü: 2úéúNACKó|′e
*******************************************************************************/
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: void IIC_Send_Byte(u8 txd)
*1|¡¡¡¡Äü: IIC·¢Ëíò»¸ö×Ö½ú
*******************************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//à-μíê±Öó¿aê¼êy¾Y′«êä
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: u8 IIC_Read_Byte(unsigned char ack)
*1|¡¡¡¡Äü: //¶á1¸ö×Ö½ú£¬ack=1ê±£¬·¢ËíACK£¬ack=0£¬·¢ËínACK
*******************************************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDAéèÖÃÎaêäèë
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)
receive++;
delay_us(1);
}
if (ack)
IIC_Ack(); //·¢ËíACK
else
IIC_NAck();//·¢ËínACK
return receive;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data)
*1|¡¡¡¡Äü: ¶áè¡Ö¸¶¨é豸 Ö¸¶¨¼Ä′æÆ÷μÄ length¸öÖμ
êäèë dev Ä¿±êé豸μØÖ·
reg ¼Ä′æÆ÷μØÖ·
length òa¶áμÄ×Ö½úêy
*data ¶á3öμÄêy¾Y½«òa′æ·ÅμÄÖ¸Õë
·μ»Ø ¶á3öà′μÄ×Ö½úêyá¿
*******************************************************************************/
u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data)
{
u8 count = 0;
IIC_Start();
IIC_Send_Byte(dev<<1); //·¢ËíD′Ãüáî
IIC_Wait_Ack();
IIC_Send_Byte(reg); //·¢ËíμØÖ·
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((dev<<1)+1); //½øèë½óêÕÄ£ê½
IIC_Wait_Ack();
for(count=0;count<length;count++)
{
if(count!=length-1)data[count]=IIC_Read_Byte(1); //′øACKμĶáêy¾Y
else data[count]=IIC_Read_Byte(0); //×îoóò»¸ö×Ö½úNACK
}
IIC_Stop();//2úéúò»¸öí£Ö1ìõ¼t
return count;
}
/**************************êμÏÖoˉêy********************************************
*oˉêyÔ-Dí: u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data)
*1|¡¡¡¡Äü: ½«¶à¸ö×Ö½úD′èëÖ¸¶¨é豸 Ö¸¶¨¼Ä′æÆ÷
êäèë dev Ä¿±êé豸μØÖ·
reg ¼Ä′æÆ÷μØÖ·
length òaD′μÄ×Ö½úêy
*data ½«òaD′μÄêy¾YμÄê×μØÖ·
·μ»Ø ·μ»ØêÇ·ñ3é1|
*******************************************************************************/
u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data)
{
u8 count = 0;
IIC_Start();
IIC_Send_Byte(dev<<1); //·¢ËíD′Ãüáî
IIC_Wait_Ack();
IIC_Send_Byte(reg); //·¢ËíμØÖ·
IIC_Wait_Ack();
for(count=0;count<length;count++)
{
IIC_Send_Byte(data[count]);
IIC_Wait_Ack();
}
IIC_Stop();//2úéúò»¸öí£Ö1ìõ¼t
return 1; //status == 0;
}
#ifndef __IIC901_H
#define __IIC901_H
#include "sys.h"
#include "delay.h"
//IO·½ÏòéèÖÃ
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//IO2ù×÷oˉêy
#define IIC_SCL PBout(10) //SCL
#define IIC_SDA PBout(11) //SDA
#define READ_SDA PBin(11) //êäèëSDA
//IICËùóD2ù×÷oˉêy
void IIC_Init(void); //3õê¼»ˉIICμÄIO¿ú
void IIC_Start(void); //·¢ËíIIC¿aê¼DÅoÅ
void IIC_Stop(void); //·¢ËíIICí£Ö1DÅoÅ
void IIC_Send_Byte(u8 txd); //IIC·¢Ëíò»¸ö×Ö½ú
u8 IIC_Read_Byte(unsigned char ack);//IIC¶áè¡ò»¸ö×Ö½ú
u8 IIC_Wait_Ack(void); //IICμè′yACKDÅoÅ
void IIC_Ack(void); //IIC·¢ËíACKDÅoÅ
void IIC_NAck(void); //IIC2»·¢ËíACKDÅoÅ
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
unsigned char I2C_Readkey(unsigned char I2C_Addr);
unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr);
unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data);
unsigned char IICwriteCmd(unsigned char dev, unsigned char cmd);
u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data);
u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data);
u8 IICwriteBit(u8 dev,u8 reg,u8 bitNum,u8 data);
u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data);
#endif
//------------------End of File----------------------------
JY901功能函数
#include "jy901.h"
//shortDí×a»ˉÎacharDí
void ShortToChar(short sData,unsigned char cData[])
{
cData[0] = sData&0xff;
cData[1] = sData>>8;
}
//charDí×a»ˉÎashortDí
short CharToShort(unsigned char cData[])
{
return ((short)cData[1]<<8) | cData[0];
}
//óÃiic¶áè¡jy901Ä£¿éμÄÖμ
void jy901(void)
{
unsigned char temp[30];
float angle[3];
unsigned char str[100];
static u32 t;
IICreadBytes(0x40, Roll, 6, &temp[0]);
angle[0] = (float)CharToShort(&temp[0])/32768*180; //½Ç¶è
angle[1] = (float)CharToShort(&temp[2])/32768*180;
angle[2] = (float)CharToShort(&temp[4])/32768*180;
sprintf((char*)str,"%5d adress(0x50):Angle:%8.3f %8.3f %8.3f \r\n",t,angle[0],angle[1],angle[2]);
printf("%s\r\n",str);
t++;
}
#ifndef __AHRSREG_H
#define __AHRSREG_H
#include "sys.h"
#include "iic901.h"
#include "usart.h"
void jy901(void); //¶áè¡jy901Öμ
void ShortToChar(short sData,unsigned char cData[]);
short CharToShort(unsigned char cData[]);
#define SAVE 0x00
#define CALSW 0x01
#define RSW 0x02
#define RRATE 0x03
#define BAUD 0x04
#define AXOFFSET 0x05
#define AYOFFSET 0x06
#define AZOFFSET 0x07
#define GXOFFSET 0x08
#define GYOFFSET 0x09
#define GZOFFSET 0x0a
#define HXOFFSET 0x0b
#define HYOFFSET 0x0c
#define HZOFFSET 0x0d
#define D0MODE 0x0e
#define D1MODE 0x0f
#define D2MODE 0x10
#define D3MODE 0x11
#define D0PWMH 0x12
#define D1PWMH 0x13
#define D2PWMH 0x14
#define D3PWMH 0x15
#define D0PWMT 0x16
#define D1PWMT 0x17
#define D2PWMT 0x18
#define D3PWMT 0x19
#define IICADDR 0x1a
#define LEDOFF 0x1b
#define GPSBAUD 0x1c
#define YYMM 0x30
#define DDHH 0x31
#define MMSS 0x32
#define MS 0x33
#define AX 0x34
#define AY 0x35
#define AZ 0x36
#define GX 0x37
#define GY 0x38
#define GZ 0x39
#define HX 0x3a
#define HY 0x3b
#define HZ 0x3c
#define Roll 0x3d
#define Pitch 0x3e
#define Yaw 0x3f
#define TEMP 0x40
#define D0Status 0x41
#define D1Status 0x42
#define D2Status 0x43
#define D3Status 0x44
#define PressureL 0x45
#define PressureH 0x46
#define HeightL 0x47
#define HeightH 0x48
#define LonL 0x49
#define LonH 0x4a
#define LatL 0x4b
#define LatH#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "jy901.h"
#include "iic901.h"
int main(void)
{
delay_init();
uart_init(115200);
IIC_Init();
while (1)
{
jy901();
delay_ms(100);
}
}
0x4c
#define GPSHeight 0x4d
#define GPSYAW 0x4e
#define GPSVL 0x4f
#define GPSVH 0x50
#define DIO_MODE_AIN 0
#define DIO_MODE_DIN 1
#define DIO_MODE_DOH 2
#define DIO_MODE_DOL 3
#define DIO_MODE_DOPWM 4
#define DIO_MODE_GPS 5
#endif
最后是主函数
[img]file:///C:\Users\Administrator\Documents\Tencent Files\2462423437\Image\C2C\3P$X[Y`NA$1_H0V8L60SU9K.jpg[/img]
[img]file:///C:\Users\Administrator\Documents\Tencent Files\2462423437\Image\C2C\3P$X[Y`NA$1_H0V8L60SU9K.jpg[/img]
我来回答