STM32中使用MMA7660重力加速度传感器
扫描二维码
随时随地手机看文章
最近在项目中要用到飞思卡尔的MMA7660这一款传感器,我在STM32中使用的是模拟I2C来读写它的寄存器,闲话不多说,代码如下:
1、IO引脚配置和模拟I2C的方法
/********************(C)COPYRIGHT2015ASTO**************************
@*文件名:mma7660.c
@*描述:飞思卡尔的MMA7660系列重力加速度传感器
@*开发平台:STM32F103CBT6系列处理器
@*通信方式:I2C
@*硬件连接:------------------------------
*|PB1:中断引脚|
*|PB10:SCL数据线|
*|PB11:SDA数据线|
*------------------------------
@*库版本:ST3.5.0
@*开发者:POWER
************************************************************************/
#include"stm32f10x.h"
#include"mma7660.h"
#include"delay.h"
/*
*=========================================================
*函数功能:MMA7660中断向量表配置
*参数:无
*
*函数返回值:无
*=========================================================
*/
staticvoidMMA7660_NVIC_Config(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*EnabletheEXTI1Interrupt*/
NVIC_InitStructure.NVIC_IRQChannel=MMA7660_INT_IRQ;//中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道中断使能
NVIC_Init(&NVIC_InitStructure);//初始化中断
}
/*
*=========================================================
*函数功能:MMA7660中断线配置
*参数:无
*
*函数返回值:无
*=========================================================
*/
staticvoidMMA7660_ExtiInit(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
MMA7660_NVIC_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//配置MMA7660模块发生相应的事件后中断配置
GPIO_EXTILineConfig(MMA7660_INT_PORT_SRC,MMA7660_INT_SOURCE);
EXTI_InitStructure.EXTI_Line=MMA7660_INT_LINE;//中断线
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//使用中断方式触发模式(另外还有事件方式触发模式)
EXTI_InitStructure.EXTI_Trigger=MMA7660_INT_MODE;//中断信号触发边沿
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断线使能
EXTI_Init(&EXTI_InitStructure);//初始化中断
}
/*
**********************************************************
*
*IIC总线模拟程序
*
**********************************************************
*/
/*
*=========================================================
*函数功能:MMA7660端口状态配置
*参数:无
*
*函数返回值:无
*=========================================================
*/
voidMMA7660_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//中断引脚配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB,&GPIO_InitStructure);//选择B端口
//SCL数据线配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//普通推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速率50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//选择B端口
//SDA数据线配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速率50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//选择B端口
MMA7660_ExtiInit();//中断配置
MMA7660_Begin();//MMA7660寄存器配置
}
/*
*=========================================================
*函数功能:MMA7660的SDA数据线配置,这里作为输出用
*参数:无
*
*函数返回值:无
*=========================================================
*/
voidMMA_SDA_IOOUT(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速率50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//选择B端口
}
/*
*=========================================================
*函数功能:MMA7660的SDA数据线配置,这里作为输入用
*参数:无
*
*函数返回值:无
*==================