作者:卢老师,华清远见嵌入式学院讲师。

在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的值相关推荐

  1. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出

    文章目录 前言 一.I2C总线通信协议 1.I2C总线 2.工作原理 3.I2C特点 4.I2C模式选择 5.软件I2C和硬件I2C 二.串口输出温湿度传感器的数据 1.核心代码分析 2.硬件实操连接 ...

  2. STM32F103VET6单片机16路ADC采集通道,AD值3种处理方式效果对比

            首先来看一下采样电路的原理图,本电路运用了16个10K滑动变阻器对3.3V的系统电压进行分压.10K滑动变阻器有3个引脚,两端的引脚分别接到+3.3V和GND上,通过调节滑动变阻器,其 ...

  3. zigbee协议栈ADC采集外部电压

    ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...

  4. adc采样的值跳动_嵌入式er必知:模数采样知多少(最全总结)

    [导读]  生活环境周围信号万万千,对于一个嵌入式er.我们利用技术去了解世界.改变世界.而一个产品要与外界物理环境打交道,一个至关重要的触角就是采样真实模拟世界的信号,翻译成芯片可理解的数字信号,进 ...

  5. 按键防抖_单片机用一个IO口采集多个按键信号

    一般按键信号都是高低电平,对于每一个按键信号单片机都需要一个IO口进行采集,这种按键采集方式比较简单,但是占用的单片机IO口比较多. 如果按键非常多,例如键盘,可以采用行列阵列方式进行信号采集.这种方 ...

  6. STM32F0xx_ADC采集电压配置详细过程

    前言 关于ADC这一块的功能基本上也算是CortexM芯片的标配了.ST的每一块芯片都有这个功能,只是说因型号不同,通道数.位数等有所不同.STM8的芯片大多数都是10的,也就是说分辨率可达到:参考电 ...

  7. linux中的定时器检测按键,STM32单片机利用定时器实现按键采集

    工程项目结构如下图所示: 其中画红色方框部分为重要函数来进行讲解 TIMx.c #include "TIMx/TIMx.h" #include "LED/LED.h&qu ...

  8. axi dma 寄存器配置_「STM32」DMA采集单通道,简单数据分析

    什么是DMA DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据由DMA ...

  9. 研华数据采集卡如何采集压力信号转化为数字信号_感知世界的模拟量信号

    在电工,电子领域,我们经常会遇到各种模拟量信号如电压,电流,在大自然中更是有多种模拟量信号,如温度,风速,压力,湿度,酸碱度,那么如何定义模拟量信号呢?在模拟电子技术中:是指用连续变化的物理量所表达的 ...

  10. STM32 ADC没有输入电压时,采集结果不为0

    目录 1. 问题概述 2. 问题分析 2.1 钳位二极管 2.2 反向漏电流 3. 复用功能 4. 总结 1. 问题概述 硬件焊接完成后测试程序ADC采集功能,先通过接入3.3V来看下.结果发现三个通 ...

最新文章

  1. LeetCode简单题之按照频率将数组升序排序
  2. php读取屏幕大小,jQuery 获取屏幕尺寸
  3. 最大公约数gcd和Win32版本实现
  4. 启明云端分享| 2.4寸磁编码旋钮屏
  5. html number方法,JavaScript Number 对象
  6. 外网服务器搭建网站并获取域名教程
  7. python编译make_Python在Linux下编译安装
  8. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)
  9. 【原创】记一次HttpWebRequest中国移动查账单爬虫的攻克历程
  10. 100篇文献-万字总结 || 强化学习求解车间调度
  11. React和Vue对比
  12. 二维码扫码登陆流程设计
  13. 杭电2079-选课时间(题目已修改,注意读题)
  14. 融云:让银行轻松上“云”
  15. linux设置display参数,Linux DISPLAY 变量设置
  16. python范例_最佳Python代码范例
  17. 计算机说课比赛稿,《从军行》说课比赛稿
  18. 终于可以向重复的鉴权代码说byebye 了 -- (玩转 AOP和Annotation )
  19. 如何恢复红米手机数据
  20. linux解压rar

热门文章

  1. win10安装打印机操作无法完成0x0000007e找不到指定模块
  2. Microsoft Teams 报错:We‘re sorry-we‘ve run into an issue.
  3. 死记3dmax快捷键有用么?
  4. 在imitate中遇到的问题
  5. Android仿人人客户端(v5.7.1)——消息中心视图的实现
  6. 先天八卦图的排列顺序,这样来解释您能接受吗?
  7. java线程锁有哪几种_Java锁有哪些种类,以及区别
  8. 如何检查python安装成功_如何检查python是否安装成功
  9. Ubuntu16.04关机后自动重启解决方案
  10. java 0点时间_java 获取当前时间与零点的时间差