OpenEdv-开源电子网

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

JY-901的IIC通信协议,时钟无法读取数据

[复制链接]

3

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-5-3
在线时间
26 小时
发表于 2018-5-24 20:31:30 | 显示全部楼层 |阅读模式
15金钱
  本人做毕业设计时,用到了JY-901这个模块用来测量姿态信息,参照IIC写了IIC程序,可是下载到板子上始终无反应,无法读取数据,想问下各位是什么原因,IIC的上拉电阻该如何配置?怎么才能读取JY-901
IIC通信得来的数据?使用use Simulator,或者ST-LINK哪个才能实现在线的硬件仿真,如何才能看到读取的IIC数据呢?

STM32F103的IIC接口电路

                                             

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);                             
        //ÅäÖ&#195B6 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);
    }         
}          

/**************************êμ&#207;&#214;oˉêy********************************************
*oˉêy&#212;-Dí:                u8 IIC_Read_Byte(unsigned char ack)
*1|&#161;&#161;&#161;&#161;&#196;ü:            //&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK
*******************************************************************************/  
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;
        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(); //·¢&#203;íACK
        else
                IIC_NAck();//·¢&#203;ínACK  
        return receive;
}

/**************************êμ&#207;&#214;oˉêy********************************************
*oˉêy&#212;-Dí:                u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data)
*1|&#161;&#161;&#161;&#161;&#196;ü:          &#182;áè&#161;&#214;&#184;&#182;¨éè±&#184; &#214;&#184;&#182;¨&#188;&#196;′&#230;&#198;÷μ&#196; length&#184;&#246;&#214;μ
ê&#228;è&#235;        dev                  &#196;&#191;±êéè±&#184;μ&#216;&#214;·
                        reg                   &#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
                        length         òa&#182;áμ&#196;×&#214;&#189;úêy
                        *data   &#182;á3&#246;μ&#196;êy&#190;Y&#189;&#171;òa′&#230;·&#197;μ&#196;&#214;&#184;&#213;&#235;
·μ&#187;&#216;   &#182;á3&#246;à′μ&#196;×&#214;&#189;úêyá&#191;
*******************************************************************************/
u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data)
{
        u8 count = 0;
        IIC_Start();
        IIC_Send_Byte(dev<<1);           //·¢&#203;íD′&#195;üá&#238;
        IIC_Wait_Ack();
        IIC_Send_Byte(reg);   //·¢&#203;íμ&#216;&#214;·
  IIC_Wait_Ack();          
        IIC_Start();
        IIC_Send_Byte((dev<<1)+1);  //&#189;&#248;è&#235;&#189;óê&#213;&#196;£ê&#189;       
        IIC_Wait_Ack();
        for(count=0;count<length;count++)
        {
                if(count!=length-1)data[count]=IIC_Read_Byte(1);  //′&#248;ACKμ&#196;&#182;áêy&#190;Y
                else  data[count]=IIC_Read_Byte(0);         //×&#238;oóò&#187;&#184;&#246;×&#214;&#189;úNACK
        }
        IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t
        return count;
}

/**************************êμ&#207;&#214;oˉêy********************************************
*oˉêy&#212;-Dí:                u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data)
*1|&#161;&#161;&#161;&#161;&#196;ü:            &#189;&#171;&#182;à&#184;&#246;×&#214;&#189;úD′è&#235;&#214;&#184;&#182;¨éè±&#184; &#214;&#184;&#182;¨&#188;&#196;′&#230;&#198;÷
ê&#228;è&#235;        dev  &#196;&#191;±êéè±&#184;μ&#216;&#214;·
                reg          &#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
                length òaD′μ&#196;×&#214;&#189;úêy
                *data  &#189;&#171;òaD′μ&#196;êy&#190;Yμ&#196;ê×μ&#216;&#214;·
·μ&#187;&#216;   ·μ&#187;&#216;ê&#199;·&#241;3é1|
*******************************************************************************/
u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data)
{  
        u8 count = 0;
        IIC_Start();
        IIC_Send_Byte(dev<<1);           //·¢&#203;íD′&#195;üá&#238;
        IIC_Wait_Ack();
        IIC_Send_Byte(reg);   //·¢&#203;íμ&#216;&#214;·
        IIC_Wait_Ack();          
        for(count=0;count<length;count++)
        {
                IIC_Send_Byte(data[count]);
                IIC_Wait_Ack();
        }
        IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t
        return 1; //status == 0;
}

#ifndef __IIC901_H
#define __IIC901_H
#include "sys.h"
#include "delay.h"

//IO·&#189;&#207;òéè&#214;&#195;
#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)  //ê&#228;è&#235;SDA

//IIC&#203;ùóD2ù×÷oˉêy
void IIC_Init(void);                //3&#245;ê&#188;&#187;ˉIICμ&#196;IO&#191;ú                                 
void IIC_Start(void);                                //·¢&#203;íIIC&#191;aê&#188;D&#197;o&#197;
void IIC_Stop(void);                                  //·¢&#203;íIICí£&#214;1D&#197;o&#197;
void IIC_Send_Byte(u8 txd);                        //IIC·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
u8 IIC_Read_Byte(unsigned char ack);//IIC&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
u8 IIC_Wait_Ack(void);                                 //IICμè′yACKD&#197;o&#197;
void IIC_Ack(void);                                        //IIC·¢&#203;íACKD&#197;o&#197;
void IIC_NAck(void);                                //IIC2&#187;·¢&#203;íACKD&#197;o&#197;

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&#187;ˉ&#206;acharDí
void ShortToChar(short sData,unsigned char cData[])
{
        cData[0] = sData&0xff;
        cData[1] = sData>>8;
}
//charDí×a&#187;ˉ&#206;ashortDí
short CharToShort(unsigned char cData[])
{
        return ((short)cData[1]<<8) | cData[0];
}
//ó&#195;iic&#182;áè&#161;jy901&#196;£&#191;éμ&#196;&#214;μ
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;                        //&#189;&#199;&#182;è
        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);                //&#182;áè&#161;jy901&#214;μ
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]

JY901.zip

496 KB, 下载次数: 64

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-5-3
在线时间
26 小时
 楼主| 发表于 2018-5-24 20:31:54 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-25 00:28:23 | 显示全部楼层
使用ST LINK才能用硬件仿真。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-5-3
在线时间
26 小时
 楼主| 发表于 2018-5-25 12:53:28 | 显示全部楼层
原子哥,怎么判断器件JY-901模块和STM32开发板通信成功啊,硬件仿真中,能在Keil中看到么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-27 01:22:48 | 显示全部楼层
lucifar 发表于 2018-5-25 12:53
原子哥,怎么判断器件JY-901模块和STM32开发板通信成功啊,硬件仿真中,能在Keil中看到么?

看IIC读ID之类的能否成功
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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