STM32中使用MMA7660重力加速度傳感器
最近在項(xiàng)目中要用到飛思卡爾的MMA7660這一款傳感器,我在STM32中使用的是模擬I2C來讀寫它的寄存器,閑話不多說,代碼如下:
1、IO引腳配置和模擬I2C的方法
/********************(C)COPYRIGHT2015ASTO**************************
@*文件名:mma7660.c
@*描述:飛思卡爾的MMA7660系列重力加速度傳感器
@*開發(fā)平臺:STM32F103CBT6系列處理器
@*通信方式:I2C
@*硬件連接:------------------------------
*|PB1:中斷引腳|
*|PB10:SCL數(shù)據(jù)線|
*|PB11:SDA數(shù)據(jù)線|
*------------------------------
@*庫版本:ST3.5.0
@*開發(fā)者:POWER
************************************************************************/
#include"stm32f10x.h"
#include"mma7660.h"
#include"delay.h"
/*
*=========================================================
*函數(shù)功能:MMA7660中斷向量表配置
*參數(shù):無
*
*函數(shù)返回值:無
*=========================================================
*/
staticvoidMMA7660_NVIC_Config(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*EnabletheEXTI1Interrupt*/
NVIC_InitStructure.NVIC_IRQChannel=MMA7660_INT_IRQ;//中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//次優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道中斷使能
NVIC_Init(&NVIC_InitStructure);//初始化中斷
}
/*
*=========================================================
*函數(shù)功能:MMA7660中斷線配置
*參數(shù):無
*
*函數(shù)返回值:無
*=========================================================
*/
staticvoidMMA7660_ExtiInit(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
MMA7660_NVIC_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//配置MMA7660模塊發(fā)生相應(yīng)的事件后中斷配置
GPIO_EXTILineConfig(MMA7660_INT_PORT_SRC,MMA7660_INT_SOURCE);
EXTI_InitStructure.EXTI_Line=MMA7660_INT_LINE;//中斷線
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//使用中斷方式觸發(fā)模式(另外還有事件方式觸發(fā)模式)
EXTI_InitStructure.EXTI_Trigger=MMA7660_INT_MODE;//中斷信號觸發(fā)邊沿
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//初始化中斷
}
/*
**********************************************************
*
*IIC總線模擬程序
*
**********************************************************
*/
/*
*=========================================================
*函數(shù)功能:MMA7660端口狀態(tài)配置
*參數(shù):無
*
*函數(shù)返回值:無
*=========================================================
*/
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數(shù)據(jù)線配置
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數(shù)據(jù)線配置
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寄存器配置
}
/*
*=========================================================
*函數(shù)功能:MMA7660的SDA數(shù)據(jù)線配置,這里作為輸出用
*參數(shù):無
*
*函數(shù)返回值:無
*=========================================================
*/
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端口
}
/*
*=========================================================
*函數(shù)功能:MMA7660的SDA數(shù)據(jù)線配置,這里作為輸入用
*參數(shù):無
*
*函數(shù)返回值:無
*==================