# 前言
本文主要提供F4系列芯片针对JY901芯片的通讯库,供各位参考
JY901芯片提供的库函数是没有F4芯片的资料的,我对着提供的F1芯片模拟IIC通讯改了一些,使用F4硬件IIC系统实现通讯效果
开发者留意下使用iic的地址,0x50要左移一位
(作者泪奔,调试一下午没出结果就因为这个)
文件LobotServoController.h、bool.h请保存到include文件夹中
文件LobotServoController.c请保存到source文件夹中
代码实现
JY901.h
#ifndef JY901_H
#define JY901_H
#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 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
typedef struct
{
float a[3],w[3],h[3],Angle[3];
}JY901_Angle;
void JY901_RDDat(JY901_Angle *IMUx);
#endif
JY901.c
#include "JY901.h"
#include "stm32f401xc.h"
#include "i2c.h"
#include "usbd_cdc_if.h"
unsigned char chrTemp[30];
JY901_Angle IMU;
void ShortToChar(short sData,unsigned char cData[])
{
cData[0]=sData&0xff;
cData[1]=sData>>8;
}
short CharToShort(unsigned char cData[])
{
return ((short)cData[1]<<8)|cData[0];
}
void JY901_RDDat(JY901_Angle *IMUx)
{
//HAL_I2C_Mem_Read(&hi2c1, 0x50, AX, I2C_MEMADD_SIZE_8BIT, &chrTemp[0] , 24, 10);
//HAL_I2C_Mem_Read(&hi2c1, 0x78, AX, I2C_MEMADD_SIZE_8BIT, &chrTemp[0] , 24, 10);
HAL_I2C_Mem_Read(&hi2c1, 0x50<<1, AX, I2C_MEMADD_SIZE_8BIT, &chrTemp[0] , 24, 0xff);
(*IMUx).a[0] = (float)CharToShort(&chrTemp[0])/32768*16;
(*IMUx).a[1] = (float)CharToShort(&chrTemp[2])/32768*16;
(*IMUx).a[2] = (float)CharToShort(&chrTemp[4])/32768*16;
(*IMUx).w[0] = (float)CharToShort(&chrTemp[6])/32768*2000;
(*IMUx).w[1] = (float)CharToShort(&chrTemp[8])/32768*2000;
(*IMUx).w[2] = (float)CharToShort(&chrTemp[10])/32768*2000;
(*IMUx).h[0] = CharToShort(&chrTemp[12]);
(*IMUx).h[1] = CharToShort(&chrTemp[14]);
(*IMUx).h[2] = CharToShort(&chrTemp[16]);
(*IMUx).Angle[0] = (float)CharToShort(&chrTemp[18])/32768*180;
(*IMUx).Angle[1] = (float)CharToShort(&chrTemp[20])/32768*180;
(*IMUx).Angle[2] = (float)CharToShort(&chrTemp[22])/32768*180;
}