CC2530采集重力加速度MMA7455的值
作者:卢老师,华清远见嵌入式学院讲师。
在cc2530中没有IIC总线控制器,只能使用模拟的方式采集,在下面原理图中,重力加速度传感器是飞思卡尔的MMA7455L。
IIC的时钟接cc2530 的P0_5 ;数据线接 P0-7,在使用模拟方式时,数据线要随输入输出改变自己的IO方向。
原理图:
#define I2C_SCL P0_5// I2C Serial Clock
#define I2C_SDA P0_7 // I2C Serial Data
#define ADDR_MMA7455L_WR (0x1D << 1)
#define ADDR_MMA7455L_RD (0x1D << 1)
首先对IO初始化,P0DIR=0XA0;//P0_5 out;p0_7 out
IIC启动:
void I2C_start(void)
{
P0DIR|=0X80;//data out ;
I2C_SDA=1;
I2C_SCL=1;
delay_us(6);
I2C_SDA=0;
delay_us(6);
I2C_SCL=0;
delay_us(6);
}
IIc停止
void I2C_stop(void)
{
P0DIR|=0X80;//data out ;
I2C_SCL=0;
I2C_SDA=0;
delay_us(6);
I2C_SCL=1;
delay_us(6);
I2C_SDA=1;
delay_us(6);
EA = 1 ;
}
IIC等待应答
unsigned char WaitAck(void)
{
unsigned interrtime =60000; //最大值不就65536
P0DIR |=0X80;//data out ;
I2C_SDA=1;
P0DIR |=(~0X80);// data int ;
delay_us(60);
I2C_SCL=1;delay_us(6);
while(I2C_SDA)
{
errtime--;
if(!errtime)
{
I2C_stop();
return(1);
}
}
delay_us(6);
I2C_SCL = 0;
return(1);
}
IIC发送应答
void I2C_sendAck(void) // ACK
{
P0DIR |=0X80;//data out ;
I2C_SDA=0;delay_us(6);
I2C_SCL=1;delay_us(6);
I2C_SCL=0;delay_us(6);
I2C_SDA=1;
}
IIC发送一个字节
void I2C_sendByte(unsigned char sdata) //发送数据字节格式
{
unsigned char i = 8;
P0DIR |=0X80;//data out ;
while(i--)
{
I2C_SCL=0;
delay_us(60);
if((sdata& 0x80)==1)
{I2C_SDA =1;}
else
{I2C_SDA =0;}
sdata=sdata<<1;
delay_us(6);
I2C_SCL=1;
delay_us(6);
}
I2C_SCL=0;
}
IIC接受一个字节
unsigned char I2C_receiveByte(void) //接受数据
{
unsigned char i = 8;
unsigned char rdata = 0;
P0DIR |=(~0X80);// data int ;
while(i--)
{
rdata=rdata<<1;
I2C_SCL=0; delay_us(6);
I2C_SCL=1; delay_us(6);
rdata |= I2C_SDA;
delay_us(6);
}
I2C_SCL=0;
delay_us(6);
return(rdata);
}
IIC发送数据包
voidwrite_block(unsigned char address,unsigned char wdata)
{
I2C_start();
I2C_sendByte(ADDR_MMA7455L_WR);
while(!WaitAck());
I2C_sendByte(address);
while(!WaitAck());
I2C_stop();
}
//读外部数据//
signed char read_block(unsigned char address)
{
signed char j;
I2C_start();
I2C_sendByte(ADDR_MMA7455L_WR);
while(!WaitAck());
I2C_sendByte(address);
while(!WaitAck());
I2C_start();
I2C_sendByte(ADDR_MMA7455L_RD|0x01);
while(!WaitAck());
j= I2C_receiveByte();
delay_us(5);
I2C_stop();
return j;
}
读取MMA7455L x轴,y轴,z轴的值;
voidacc_read (int8_t *x, int8_t *y, int8_t *z)
{
charbuf[1];
while ((getStatus() & ACC_STATUS_DRDY) == 0);
buf[0] = read_block(ACC_ADDR_XOUT8);
*x = (char)buf[0];
buf[0] = read_block(ACC_ADDR_YOUT8);
*y = (char)buf[0];
buf[0] = read_block(ACC_ADDR_ZOUT8);
*z = (char)buf[0];
}
MMA7455L测试程序;
void Axis3_Test(void)
{
I2CInit();
acc_init();
// Assume base board in zero-g position when reading first value.
acc_read(&x, &y, &z);
xoff = 0-x;
yoff = 0-y;
zoff = 0-z;
{
acc_read(&x, &y, &z);
x = x+xoff;
y = y+yoff;
z = z+zoff;
}
}
主程序将采集的值通过串口打印出来
void main(void) {
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
IO_Init();
InitUART();
I2CInit();
write_block(0x16,0x05);
while(1)
{
Axis3_Test();
Txdata[0]=x;
Txdata[1]=0;
Txdata[2]=y;
Txdata[3]=0;
Txdata[4]=z;
Txdata[5]=0;
UartSend_String(Txdata,7); //串口发送数
Delay_ms(500); //延时
LED1=!LED1; //标志发送状态
}
}
旋转重力加速模块,,打印结果如下图:
CC2530采集重力加速度MMA7455的值相关推荐
- STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出
文章目录 前言 一.I2C总线通信协议 1.I2C总线 2.工作原理 3.I2C特点 4.I2C模式选择 5.软件I2C和硬件I2C 二.串口输出温湿度传感器的数据 1.核心代码分析 2.硬件实操连接 ...
- STM32F103VET6单片机16路ADC采集通道,AD值3种处理方式效果对比
首先来看一下采样电路的原理图,本电路运用了16个10K滑动变阻器对3.3V的系统电压进行分压.10K滑动变阻器有3个引脚,两端的引脚分别接到+3.3V和GND上,通过调节滑动变阻器,其 ...
- zigbee协议栈ADC采集外部电压
ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...
- adc采样的值跳动_嵌入式er必知:模数采样知多少(最全总结)
[导读] 生活环境周围信号万万千,对于一个嵌入式er.我们利用技术去了解世界.改变世界.而一个产品要与外界物理环境打交道,一个至关重要的触角就是采样真实模拟世界的信号,翻译成芯片可理解的数字信号,进 ...
- 按键防抖_单片机用一个IO口采集多个按键信号
一般按键信号都是高低电平,对于每一个按键信号单片机都需要一个IO口进行采集,这种按键采集方式比较简单,但是占用的单片机IO口比较多. 如果按键非常多,例如键盘,可以采用行列阵列方式进行信号采集.这种方 ...
- STM32F0xx_ADC采集电压配置详细过程
前言 关于ADC这一块的功能基本上也算是CortexM芯片的标配了.ST的每一块芯片都有这个功能,只是说因型号不同,通道数.位数等有所不同.STM8的芯片大多数都是10的,也就是说分辨率可达到:参考电 ...
- linux中的定时器检测按键,STM32单片机利用定时器实现按键采集
工程项目结构如下图所示: 其中画红色方框部分为重要函数来进行讲解 TIMx.c #include "TIMx/TIMx.h" #include "LED/LED.h&qu ...
- axi dma 寄存器配置_「STM32」DMA采集单通道,简单数据分析
什么是DMA DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据由DMA ...
- 研华数据采集卡如何采集压力信号转化为数字信号_感知世界的模拟量信号
在电工,电子领域,我们经常会遇到各种模拟量信号如电压,电流,在大自然中更是有多种模拟量信号,如温度,风速,压力,湿度,酸碱度,那么如何定义模拟量信号呢?在模拟电子技术中:是指用连续变化的物理量所表达的 ...
- STM32 ADC没有输入电压时,采集结果不为0
目录 1. 问题概述 2. 问题分析 2.1 钳位二极管 2.2 反向漏电流 3. 复用功能 4. 总结 1. 问题概述 硬件焊接完成后测试程序ADC采集功能,先通过接入3.3V来看下.结果发现三个通 ...
最新文章
- LeetCode简单题之按照频率将数组升序排序
- php读取屏幕大小,jQuery 获取屏幕尺寸
- 最大公约数gcd和Win32版本实现
- 启明云端分享| 2.4寸磁编码旋钮屏
- html number方法,JavaScript Number 对象
- 外网服务器搭建网站并获取域名教程
- python编译make_Python在Linux下编译安装
- LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)
- 【原创】记一次HttpWebRequest中国移动查账单爬虫的攻克历程
- 100篇文献-万字总结 || 强化学习求解车间调度
- React和Vue对比
- 二维码扫码登陆流程设计
- 杭电2079-选课时间(题目已修改,注意读题)
- 融云:让银行轻松上“云”
- linux设置display参数,Linux DISPLAY 变量设置
- python范例_最佳Python代码范例
- 计算机说课比赛稿,《从军行》说课比赛稿
- 终于可以向重复的鉴权代码说byebye 了 -- (玩转 AOP和Annotation )
- 如何恢复红米手机数据
- linux解压rar
热门文章
- win10安装打印机操作无法完成0x0000007e找不到指定模块
- Microsoft Teams 报错:We‘re sorry-we‘ve run into an issue.
- 死记3dmax快捷键有用么?
- 在imitate中遇到的问题
- Android仿人人客户端(v5.7.1)——消息中心视图的实现
- 先天八卦图的排列顺序,这样来解释您能接受吗?
- java线程锁有哪几种_Java锁有哪些种类,以及区别
- 如何检查python安装成功_如何检查python是否安装成功
- Ubuntu16.04关机后自动重启解决方案
- java 0点时间_java 获取当前时间与零点的时间差