Files
Hero-C-Board-Legacy/云台/云台-old/Hardware/IST8310.c

269 lines
10 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stm32f4xx.h" // Device header
#include "stm32f4xx_conf.h"
#include "MyI2C.h"
#include "Warming.h"
#include "Delay.h"
#define IST8310_Address 0x0E//IST8310的地址
#define IST8310_Who_Am_I 0x00//Who Am I寄存器
#define IST8310_CNTL1 0x0A//控制设置1寄存器
#define IST8310_CNTL2 0x0B//控制设置2寄存器
#define IST8310_AVGCNTL 0x41//采样平均寄存器
#define IST8310_PDCNTL 0x42//脉冲持续时间寄存器
#define IST8310_DataStart 0x03//数据寄存器首地址
#define IST8310_TEMPL 0x1C//温度寄存器-温度低八位
#define IST8310_TEMPH 0x1D//温度寄存器-温度高八位
MyI2C_InitTypedef MyI2C_InitStruction;//I2C配置结构体
uint8_t IST8310_DataStartFlag;//IST8310开始接收数据标志位
int16_t IST8310_RawData[4];//IST8310原始数据,1~3为xyz轴磁场原始数据,4为温度原始数据
float IST8310_MagneticField[3];//IST8310磁场数据,分别为xyz轴磁场数据(单位uT)
float IST8310_Temperature;//IST8310温度数据(单位℃)
/*
*函数简介:IST8310的RSTN延时
*参数说明:无
*返回类型:无
*备注:默认配置RSTN延时500us,重启一次延时1ms
*/
void IST8310_Delay_us(void)
{
uint32_t temp;
SysTick->LOAD=500*21; //时间加载我们要延时500倍的us, 1us是一个fac_ua周期所以总共要延时的周期值为二者相乘最后送到Load中。
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开启使能位 开始倒数
do temp=SysTick->CTRL;
while((temp&0x01) && !(temp&(1<<16))); //用来判断 systick 定时器是否还处于开启状态然后在等待时间到达也就是数到0的时候,此时第十六位设置为1
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器使能位
SysTick->VAL=0x00; //清空计数器
}
/*
*函数简介:IST8310配置RSTN电平
*参数说明:高低电平,0-低电平 1-高电平
*返回类型:无
*备注:规定RSTN为PG6
*备注:RSTN为低电平时重启IST8310
*备注:每次修改RSTN,需要等待一段时间产生作用(测试得到0.5ms足矣)
*/
void IST8310_RSTN(uint8_t x)
{
GPIO_WriteBit(GPIOG,GPIO_Pin_6,(BitAction)(x));
IST8310_Delay_us();//延时0.5ms
}
/*
*函数简介:IST8310重启
*参数说明:无
*返回类型:无
*备注:重启大概耗时1ms
*/
void IST8310_Reset(void)
{
IST8310_RSTN(0);
IST8310_RSTN(1);
}
/*
*函数简介:IST8310初始化
*参数说明:无
*返回类型:无
*备注:规定SCL为PA8,SDA为PC9,DRDY为PG3(下降沿)
*备注:初始化中配置了寄存器并进行了重启,大概耗时1ms
*备注:在初始化中对寄存器进行了配置
*备注:初始化时会检查IST8310的ID,ID错误会进行报警,并且程序会卡死不断的进行检测,具体报警现象见Warming.h
*/
void IST8310_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//开启时钟
MyI2C_InitStruction.MyI2C_SCL_RCC=RCC_AHB1Periph_GPIOA;//配置SCL为PA8
MyI2C_InitStruction.MyI2C_SCL_GPIOx=GPIOA;
MyI2C_InitStruction.MyI2C_SCL_Pin=GPIO_Pin_8;
MyI2C_InitStruction.MyI2C_SDA_RCC=RCC_AHB1Periph_GPIOC;//配置SDA为PC9
MyI2C_InitStruction.MyI2C_SDA_GPIOx=GPIOC;
MyI2C_InitStruction.MyI2C_SDA_Pin=GPIO_Pin_9;
MyI2C_Init(&MyI2C_InitStruction);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置DRDY(PG3)
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG,EXTI_PinSource3);//配置PG3与中断线的映射关系
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line3;//配置中断线3
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中断线
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//配置为外部中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//选择下降沿触发
EXTI_Init(&EXTI_InitStructure);//初始化EXTI
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择NVIC分组为2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;//配置NVIC通道3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVIC通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
while(1)
{
if(MyI2C_CheckDevice(&MyI2C_InitStruction,IST8310_Address)==1 && MyI2C_CheckWhoAmI(&MyI2C_InitStruction,IST8310_Address,IST8310_Who_Am_I)==0x10)//设备连接正常,Who Am I正确
{
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//开启NVIC通道
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_CNTL1,0x03);//配置为连续输出模式,输出频率200Hz
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_CNTL2,0x08);//配置为DRDY下降沿中断,不重启
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_AVGCNTL,0x12);//配置为四次采样平均
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_PDCNTL,0xC0);//配置为正常脉冲持续时间
IST8310_Reset();//IST8310重启
break;
}
else//设备异常
{
NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;//关闭NVIC通道
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
Warming_IST8310LinkError();//IST8310连接异常报警
Delay_ms(25);
}
}
while(IST8310_DataStartFlag==0);//等待数据开始接收
}
/*
*函数简介:IST8310数据读取
*参数说明:无
*返回类型:无
*备注:读取三轴磁场(单位uT)和温度(单位℃)
*备注:温度转换比例没找到,暂且以0.001为比例转换
*/
void IST8310_GetData(void)
{
uint8_t IST8310_MagneticFieldReceive[6],TempL,TempH;//三轴磁场返回数据,温度返回数据(低八位),温度返回数据(高八位)
MyI2C_ContinuousReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_DataStart,IST8310_MagneticFieldReceive,6);//读取三轴磁场返回数据
TempL=MyI2C_ReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_TEMPL);//读取温度返回数据(低八位)
TempH=MyI2C_ReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_TEMPH);//读取温度返回数据(高八位)
IST8310_RawData[0]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[1])<<8)|IST8310_MagneticFieldReceive[0]);
IST8310_RawData[1]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[3])<<8)|IST8310_MagneticFieldReceive[2]);
IST8310_RawData[2]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[5])<<8)|IST8310_MagneticFieldReceive[4]);//获取三轴磁场原始数据
IST8310_RawData[3]=(int16_t)(((uint16_t)(TempH)<<8)|TempL);//获取温度原始数据
IST8310_MagneticField[0]=IST8310_RawData[0]*0.3f;
IST8310_MagneticField[1]=IST8310_RawData[1]*0.3f;
IST8310_MagneticField[2]=IST8310_RawData[2]*0.3f;//获取三轴磁场数据
IST8310_Temperature=IST8310_RawData[3]*0.001f;//获取温度
}
/*
*函数简介:IST8310外部中断中断函数
*参数说明:无
*返回类型:无
*备注:在中断函数中读取数据
*/
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)==SET)//检测IST8310外部中断触发(即检测EXTI通道3中断触发)
{
EXTI_ClearITPendingBit(EXTI_Line3);//清除标志位
IST8310_GetData();//读取数据
IST8310_DataStartFlag=1;//数据开始接收
}
}
/*硬件I2C的遗骸*/
////void IST8310_I2CInit(void)
////{
////
////
//// GPIO_InitTypeDef GPIO_InitStructure;
//// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
//// GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
//// GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
//// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//// GPIO_Init(GPIOA,&GPIO_InitStructure);
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
//// GPIO_Init(GPIOC,&GPIO_InitStructure);
//// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//// GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
//// GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
//// GPIO_Init(GPIOG,&GPIO_InitStructure);
////
//// GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_I2C3);
//// GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_I2C3);
////
//// I2C_InitTypeDef I2C_InitStructure;
//// I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
//// I2C_InitStructure.I2C_ClockSpeed=10000;
//// I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
//// I2C_InitStructure.I2C_Ack=I2C_Ack_Disable;
//// I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
//// I2C_InitStructure.I2C_OwnAddress1=0x01;
//// I2C_Init(I2C3,&I2C_InitStructure);
////
//// I2C3->CR1 |= I2C_CR1_SWRST;
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)==SET);
//// I2C3->CR1 &= ~I2C_CR1_SWRST;
////
//// I2C_Cmd(I2C3,ENABLE);
////
//// GPIO_ResetBits(GPIOG,GPIO_Pin_6);
//// Delay_ms(50);
//// GPIO_SetBits(GPIOG,GPIO_Pin_6);
//// Delay_ms(50);
//// LED_BInit();
////}
////void IST8310_I2CWriteData(uint8_t Address,uint8_t Data)
////{
//// uint8_t B=0;
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)==SET);
////
//// I2C_GenerateSTART(I2C3,ENABLE);
//// while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
////
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)!=SET);
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_MSL)!=SET);
//// //I2C_SendData(I2C3,0x0E<<1);
//// int i=0;
//// do
//// {
//// I2C_Send7bitAddress(I2C3,i<<1,I2C_Direction_Receiver);
//// i++;
//// if(i==0x8F)break;
//// }
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_ADDR)!=SET);
//// if(i<0x8F)LED_BON();
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
//// I2C_SendData(I2C3,0x00);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!=SUCCESS);
////
////// I2C_SendData(I2C3,Data);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
//// I2C_GenerateSTART(I2C3,ENABLE);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
////
//// //I2C_SendData(I2C3,(0x0E<<1)|0x01);
//// I2C_Send7bitAddress(I2C3,0x0E,I2C_Direction_Receiver);
//// //while(I2C_GetFlagStatus(I2C3,I2C_FLAG_AF)==SET);
//// //while(I2C_GetFlagStatus(I2C3,I2C_FLAG_ADDR)!=SET);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
//// B=I2C_ReceiveData(I2C3);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!=SUCCESS);
////
//// I2C_GenerateSTOP(I2C3,ENABLE);
////}