野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8094|回复: 3

ADLX345组网发数,收到的数据全是FF 求大J家指导啊

[复制链接]
发表于 2016-6-13 11:05:29 | 显示全部楼层 |阅读模式
小弟在用CC2530和ADXL345做加速度读取,单机调试的时候,加速度能正常读取
把程序加入到组网程序中,协调器读取时数值全是FF 这是什么情况啊,求指导
感激不尽  

以下是我的程序
#include  <ioCC2530.h>  
#include  <stdio.h>  
#include "DHT11.h"

//使用的端口,请按照以下接线
#define        SCL   P0_0      //IIC时钟引脚定义
#define        SDA   P0_1     //IIC数据引脚定义
#define SDADirOut P0DIR|=0x02;      //xxxx1M01
#define SDADirIn  P0DIR&=~0x02;
#define        SlaveAddress   0xA6          //定义器件5883在IIC总线中的从地址

#define   uchar unsigned char
#define   uint  unsigned int
typedef unsigned char BYTE;

char X_Txdata[8];
char Y_Txdata[8];
char Z_Txdata[8];

BYTE BUF[8];                         //接收数据缓存区   

uchar ge,shi,bai,qian,wan;           //显示变量
int  dis_data;                       //变量

//************
void init_uart(void);
void delay(unsigned int k);
void Init_ADXL345(void);            //初始化5883
void conversion(uint temp_data);
void display_x(void);
void display_y(void);
void display_z(void);

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
//uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
void  Multiple_Read_ADXL345(void);                                  //连续的读取内部寄存器数据
//以下是模拟iic使用函数-------------
void Delayus(unsigned int usec);
void ADXL345_Start(void);
void ADXL345_Stop(void);
void ADXL345_SendACK(char ack);
char ADXL345_RecvACK(void);
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte(void);
void ADXL345_ReadPage(void);
void ADXL345_WritePage(void);

void ADXL345345(void);

void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余运算
    qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余运算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余运算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余运算
    ge=temp_data+0x30;        
}

/*******************************/
#pragma optimize=none
void delay(unsigned int n)       
{                                               
uint i;
        for(i=0;i<n;i++);
        for(i=0;i<n;i++);
        for(i=0;i<n;i++);
        for(i=0;i<n;i++);
        for(i=0;i<n;i++);                                       
}
       

/**************************************
延时1微秒
**************************************/
#pragma optimize=none
void Delayus(unsigned int usec)
{

    while(usec--)
    {
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
        asm("nop");asm("nop");asm("nop");asm("nop");
    }
}

/*******起始信号********************/
void ADXL345_Start()
{
    SDADirOut;
    Delayus(5);  
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delayus(5);                 //延时
    SDA = 0;                    //产生下降沿
    Delayus(5);                 //延时
    SCL = 0;                    //拉低时钟线
    Delayus(5);  
}

/*******停止信号**************/
void ADXL345_Stop()
{   
    SCL=0;                       //拉高时钟线
    Delayus(1);  
    SDADirOut;
    Delayus(1);  
    SDA = 0;                    //拉低数据线
    Delayus(5);                 //延时
    SDA = 1;                    //产生上升沿
    Delayus(5);                 //延时
}

/******************
发送应答信号
入口参数:ack (0:ACK 1:NAK)**************/
void ADXL345_SendACK(char ack)
{   
    SCL = 0;
    Delayus(5);               
    SDADirOut;
    Delayus(5);      
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delayus(5);                 //延时
    SCL = 0;                    //拉低时钟线
    Delayus(5);                 //延时
}

/***接收应答*******/
char ADXL345_RecvACK()
{
    SCL=0;
    Delayus(5);
    SDADirOut;
    SDA=1;
    SDADirIn;
    Delayus(5);         
    SCL=1;
    Delayus(5);
    if(SDA==1)
    {
      SCL=0;
      return 0;  //er
    }
    SCL=0;
    return 1;
}

/**向IIC总线发送一个字节数据**********/
void ADXL345_SendByte(BYTE dat)
{
    BYTE i;
    SDADirOut;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delayus(5);             //延时
        SCL = 0;                //拉低时钟线
        Delayus(5);             //延时
    }
    ADXL345_RecvACK();
}

/********从IIC总线接收一个字节数据**********/
BYTE ADXL345_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SCL=0;
    SDADirOut;
    SDA = 1;                    //使能内部上拉,准备读取数据,
    Delayus(5);
    SDADirIn;
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delayus(5);             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delayus(5);             //延时
    }
    return dat;
}

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
{
    ADXL345_Start();                  //起始信号
    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号
    ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf
    ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf
    ADXL345_Stop();                   //发送停止信号
}
//***连续读出ADXL345内部角度数据,地址范围0x3~0x5******/
void Multiple_Read_ADXL345(void)
{   uchar i;
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x3开始       
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF[i] = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
        if (i == 5)
        {
           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {
          ADXL345_SendACK(0);                //回应ACK
       }
   }
    ADXL345_Stop();                          //停止信号

}

//初始化ADXL345,根据需要请参考pdf进行修改****
void Init_ADXL345()
{
  Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式
   Single_Write_ADXL345(0x2C,0x0F);   //速率设定为12.5 参考pdf13页
  Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
  Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
}
//*********************************************************
//主程序********
//*********************************************************
void ADXL345345()
{  
    P0DIR = 0x03;
    Init_ADXL345()
    Multiple_Read_ADXL345();      //连续读出数据,存储在BUF中
    display_x();

    display_y();

    display_z();
}

void display_x()
{     
    dis_data=(BUF[1]<<8)+BUF[0];  //合成数据   
    X_Txdata[0]='x';
    X_Txdata[1]=':';

    if(dis_data<0)
    {
      dis_data = -dis_data;
      conversion(dis_data);

      X_Txdata[2] = '-';
    }
    else
    {
      conversion(dis_data);

      X_Txdata[2] = '+';
    }
      X_Txdata[3] = qian;
      X_Txdata[4] = bai;
      X_Txdata[5] = shi;
      X_Txdata[6] = ge;
      X_Txdata[7] = ' ';
}
void display_y()
{   
    dis_data=(BUF[3]<<8)+BUF[2];  //合成数据   
    Y_Txdata[0]='y';
    Y_Txdata[1]=':';

    if(dis_data<0)
    {
      dis_data = -dis_data;
      conversion(dis_data);

      Y_Txdata[2] = '-';
    }
    else
    {
      conversion(dis_data);

      Y_Txdata[2] = '+';
    }
      Y_Txdata[3] = qian;
      Y_Txdata[4] = bai;
      Y_Txdata[5] = shi;
      Y_Txdata[6] = ge;
      Y_Txdata[7] = ' ';
}

void display_z()
{     
    dis_data=(BUF[5]<<8)+BUF[4];  //合成数据   

    Z_Txdata[0]='z';
    Z_Txdata[1]=':';

    if(dis_data<0)
    {
      dis_data = -dis_data;
      conversion(dis_data);

      Z_Txdata[2] = '-';
    }
    else
    {
      conversion(dis_data);

      Z_Txdata[2] = '+';
    }
      Z_Txdata[3] = qian;
      Z_Txdata[4] = bai;
      Z_Txdata[5] = shi;
      Z_Txdata[6] = ge;
      Z_Txdata[7] = ' ';
}


/*终端节点发数 整合部分*/
  byte strTemp[24];

  ADXL345345();             //获取为

  //将数据整合后方便发给协调器显示
  osal_memcpy(strTemp, X_Txdata, 8);
  osal_memcpy(&strTemp[8], Y_Txdata, 8);
  osal_memcpy(&strTemp[16], Z_Txdata, 8);


  if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       24,
                       strTemp,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )


/*协调器收数部分*/
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  switch ( pkt->clusterId )
  {
    case GENERICAPP_CLUSTERID:

            HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
            HalUARTWrite(0, "\n", 1);         // 回车换行
  }
}

回复

使用道具 举报

发表于 2016-6-13 12:23:24 | 显示全部楼层
帮顶
回复

使用道具 举报

 楼主| 发表于 2016-6-13 15:13:11 | 显示全部楼层
模拟IIC无法读取,有没有人遇到过类似的问题呢  求讲解
回复 支持 反对

使用道具 举报

发表于 2019-5-29 06:12:41 | 显示全部楼层
楼主还在吗,请问CC2530如何与ADXL345接线啊?!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 13:14 , Processed in 0.027929 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表