那位大侠有这个得驱动程序啊,麻烦发一下,非常感谢!xie__chong@126.com
可以参考这个程序。
#ifndef _MMA7660_H_
#define _MMA7660_H_
// LCD 硬件定义
#define MM_INT GPIO_Pin_14 // A14
#define MM_SCL GPIO_Pin_15 // A15
#define MM_SDA GPIO_Pin_10 // C10
/*
**********************************************************
*
* 相关宏定义
*
**********************************************************
*/
//==========模拟IIC==================//
#define MMA_ERROR 0
#define MMA_OK 1
#define I2C_NOACK 0
#define I2C_ACK 1
#define MMA7660_SDA GPIO_Pin_10 // C10 //IIC数据线接口
#define MMA7660_SCL GPIO_Pin_15 // A15 //IIC时钟线接口
#define MMA7660_INT GPIO_Pin_14 // A14
#define MMA7660_INT_D GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14) //PC14读数据
#define MMA7660_SDA_D GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10) //PC10读数据
#define MMA7660_SDA_H GPIO_SetBits(GPIOC, GPIO_Pin_10) // PC10 高电平
#define MMA7660_SDA_L GPIO_ResetBits(GPIOC, GPIO_Pin_10) // PC10 低电平
#define MMA7660_SCL_H GPIO_SetBits(GPIOA, GPIO_Pin_15) // PC8 高电平
#define MMA7660_SCL_L GPIO_ResetBits(GPIOA, GPIO_Pin_15) // PC8 低电平
//==========MMA7660 寄存器地址==================//
#define MMA7660_XOUT 0x00 // 6-bit output value X
#define MMA7660_YOUT 0x01 // 6-bit output value Y
#define MMA7660_ZOUT 0x02 // 6-bit output value Z
#define MMA7660_TILT 0x03 // Tilt Status
#define MMA7660_SRST 0x04 // Sampling Rate Status
#define MMA7660_SPCNT 0x05 // Sleep Count
#define MMA7660_INTSU 0x06 // Interrupt Setup
#define MMA7660_MODE 0x07 // Mode
#define MMA7660_SR 0x08 // Auto-Wake/Sleep and
// Portrait/Landscape samples
// per seconds and Debounce Filter
#define MMA7660_PDET 0x09 // Tap Detection
#define MMA7660_PD 0x0A // Tap Debounce Count
//=========MMA7660 功能参数==================//
#define MMA7660_DEV_ADDR 0x4C //Normally,can range 0x08 to 0xEF
#define MMA7660_DEV_WRITE MMA7660_DEV_ADDR<<1 | 0x00
#define MMA7660_DEV_READ MMA7660_DEV_ADDR<<1 | 0x01
/*
**********************************************************
*
* 全局函数声明
*
**********************************************************
*/
void MMA7660_Init(void); //SCL,INT端口输出配置
void MMA_SDA_IOOUT(void); //SDA端口配置为输出
void MMA_SDA_IOIN(void); //SDA端口配置为输入
void I2C_Start(void); //开始信号
void I2C_Stop(void); //结束信号
unsigned char I2C_SlaveAck(void); //应答信号
void I2C_WriteByte(unsigned char a); //写一字节
unsigned char I2C_ReadByte(void); //读一字节
void MMA7660_WriteReg(unsigned char Regs_Addr,unsigned char Regs_Data); //写寄存器
unsigned char MMA7660_ReadReg(unsigned char Regs_Addr); //读寄存器
unsigned char MMA7660_GetResult(unsigned char Regs_Addr); //读加速度
void MMA7660_Begin(void); //开始传送前的寄存器值设置
/*
**********************************************************
*
* 全局定义
*
**********************************************************
*/
#endif
#include "stm32f10x.h"
#include "mma7660.h"
#include "delay.h"
/*
**********************************************************
*
* IIC总线模拟程序
*
**********************************************************
*/
/*
*=========================================================
* 函数功能:MMA7660端口状态配置
* 参数: 无
*
* 函数返回值:无
*=========================================================
*/
void MMA7660_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 选择C端口
}
void MMA_SDA_IOOUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 选择C端口
}
void MMA_SDA_IOIN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 选择C端口
}
/*
*=========================================================
* 函数功能:IIC总线初始化信号
* 参数:无
* 函数返回值:无
* SDA ---
* |________
* SCL ----------
* |____
*=========================================================
*/
void I2C_Start(void)
{
MMA7660_SCL_H;
MMA7660_SDA_H;
Delayus(1);
MMA7660_SDA_L;
Delayus(1);
}
/*
*=========================================================
* 函数功能:IIC总线停止信号
* 参数:无
* 函数返回值:无
* SDA ---------
* ______|
* SCL ---------
* |___
*=========================================================
*/
void I2C_Stop(void)
{
MMA7660_SCL_H;
MMA7660_SDA_L;
Delayus(1);
MMA7660_SDA_H;
Delayus(1);
}
/*
*=========================================================
* 函数功能:接收由从机向主机发起的ACK信号。
* 参数: ACKBIT
*
* 函数返回值:MMA_ERROR/MMA_OK
*=========================================================
*/
unsigned char I2C_SlaveAck(void)
{
unsigned char ts=0;
MMA7660_SCL_L;
MMA7660_SDA_H;
MMA_SDA_IOIN(); //SDA设为输入
Delayus(1);
MMA7660_SCL_H;
while(MMA7660_SDA_D!=0)
{
ts++;
if(ts>200)
{
MMA_SDA_IOOUT(); //SDA设为输出
MMA7660_SCL_L;
return MMA_ERROR; //返回错误
}
}
MMA7660_SCL_L;
MMA_SDA_IOOUT(); //SDA设为输出
//MMA7660_SDA_H;
Delayus(1);
return MMA_OK; //返回错误
}
/*
*=========================================================
* 函数功能:IIC写一个字节数据
* 参数: a:需要写入的一个字节数据
* 函数返回值:无
*=========================================================
*/
void I2C_WriteByte(unsigned char a)
{
unsigned char i;
for(i=0; i<8; i++)
{
MMA7660_SCL_L;
if((a&0x80)!=0) MMA7660_SDA_H;
else MMA7660_SDA_L;
a <<= 1;
Delayus(1);
MMA7660_SCL_H;
Delayus(1);
}
MMA7660_SCL_L;
if(I2C_SlaveAck()==MMA_ERROR) //等待从机的ACK信号。
{
return ;
}
}
/*
*=========================================================
* 函数功能:IIC读一个字节数据
* 参数:无
* 函数返回值:返回读出的一个字节数据
*=========================================================
*/
unsigned char I2C_ReadByte(void)
{
unsigned char a =0;
unsigned char i;
MMA_SDA_IOIN(); //SDA设为输入
for(i=0; i<8; i++)
{
a <<= 1;
MMA7660_SCL_H;
Delayus(1);
if(MMA7660_SDA_D==1) a |= 0x01;
Delayus(1);
MMA7660_SCL_L;
Delayus(2);
}
return a;
}
/*
**********************************************************
*
* MMA7660相关函数
*
**********************************************************
*/
/*
*=========================================================
* 函数功能:写MAA7660寄存器
* 参数:
* Regs_Addr - 寄存器地址
* Regs_Data - 寄存器值
* 函数返回值:
*=========================================================
*/
void MMA7660_WriteReg(unsigned char Regs_Addr,unsigned char Regs_Data)
{
I2C_Start();
I2C_WriteByte(MMA7660_DEV_WRITE); //先写Slave地址,并配置成写模式
I2C_WriteByte(Regs_Addr); //写寄存器地址
I2C_WriteByte(Regs_Data); //写寄存器内容
I2C_Stop(); //结束本段IIC进程
}
/*
*=========================================================
* 函数功能:读MAA7660单字节
* 参数?
* Regs_Addr - 寄存器地址
* 函数返回值:寄存器值
*=========================================================
*/
unsigned char MMA7660_ReadReg(unsigned char Regs_Addr)
{
unsigned char ret;
I2C_Start();
I2C_WriteByte(MMA7660_DEV_WRITE); //先写Slave地址,并配置成写模式
I2C_WriteByte(Regs_Addr); //写寄存器地址
I2C_Start();
I2C_WriteByte(MMA7660_DEV_READ); //写Slave地址,并配置成读模式
ret=I2C_ReadByte(); //从传感器中读出数据
I2C_SlaveAck();
I2C_Stop(); //结束本段IIC进程
return ret;
}
/*
*=========================================================
* 函数功能:读MAA7660加速度输出
* 参数? :
* Regs_Addr - 加速度寄存器地址
* 函数返回值:加速度值
*=========================================================
*/
unsigned char MMA7660_GetResult(unsigned char Regs_Addr)
{
unsigned char ret;
// 等待转换完成并取出值
ret=MMA7660_ReadReg(Regs_Addr);
while(ret&0x40)
{
ret=MMA7660_ReadReg(Regs_Addr); //数据更新,重新读
}
return ret;
}
/*
*=========================================================
* 函数功能:MAA7660开始前的设置
* 参数? :
*
* 函数返回值:无
*=========================================================
*/
void MMA7660_Begin(void)
{
MMA7660_WriteReg(MMA7660_MODE,0X00); //standby mode
MMA7660_WriteReg(MMA7660_SPCNT,0X00); //No Sleep Count
MMA7660_WriteReg(MMA7660_INTSU,0X03); //Configure GINT Interrupt
MMA7660_WriteReg(MMA7660_PDET,0XE0); //No tap detection enabled
MMA7660_WriteReg(MMA7660_SR,0X34); //8 samples/s,TILT debounce filter=2
MMA7660_WriteReg(MMA7660_PD,0X00); //No tap detection debounce count enabled
MMA7660_WriteReg(MMA7660_MODE,0X41); //Active Mode,INT= push-pull and active low
}
|