bh1750在cc2540中使用时,读出的数据一直为0xff

2020-01-14 18:52发布

bh1750在cc2540中使用时,读出的数据一直为0xff,
代码如下
  1. //"初始化init_bh1750()后调用uint zhaodu()"
  2. /****************************************bh1750.c******************************************/
  3. #include "bh1750.h"
  4. #include "delay.h"

  5. #include<ioCC2540.h>
  6. uchar BUF[8];               
  7. int dis_data;

  8. void iicinit()
  9. {  
  10.    SCL_OUT;
  11.    SDA_OUT;
  12.    SDA = 1;
  13.    delay_nus(1);
  14.    SCL = 1;
  15.    delay_nus(1);
  16. }

  17. void bh1750_start()
  18. {
  19.     SCL_OUT;
  20.     SDA_OUT;
  21.      SDA = 1;
  22.      SCL = 1;   
  23.     delay_nus(1);
  24.     SDA = 0;   
  25.     delay_nus(1);
  26.     SCL = 0;
  27. }

  28. void bh1750_stop()
  29. {
  30.     SCL_OUT;
  31.     SDA_OUT;
  32.      SDA = 0;  
  33.      SCL=1;
  34.     delay_nus(1);
  35.     SDA = 1;   
  36.     delay_nus(1);
  37. }

  38. void bh1750_sendACK(uint ack)
  39. {
  40.     SCL_OUT;
  41.     SDA_OUT;
  42.     SDA = ack;  
  43.     SCL = 1;   
  44.     delay_nus(1);
  45.     SCL = 0;   
  46.    delay_nus(1);
  47. }

  48. uint bh1750_RecvACK()
  49. {
  50.     SCL_OUT;
  51.     SDA_IN;
  52.     SCL=1;   
  53.     delay_nus(1);
  54.      CY=SDA;
  55.       delay_nus(1);
  56.      SCL=0;
  57.     delay_nus(1);            
  58.     SDA_OUT;
  59.     return CY;

  60. }

  61. void bh1750_SendByte(uchar dat)
  62. {
  63.     uchar i;
  64.     SCL_OUT;
  65.     SDA_OUT;
  66.    for(i=0;i<8;i++)
  67.    {
  68.      dat <<=1;
  69.      SDA=CY;
  70.      SCL=1;
  71.      delay_nus(1);
  72.      SCL=0;
  73.      delay_nus(1);
  74.    }
  75.     bh1750_RecvACK();
  76. }

  77. uchar bh1750_RecvByte()
  78. {
  79.     uchar i;
  80.   uchar dat=0;
  81.     SDA=1;
  82.     SDA_IN;
  83.      SCL_OUT;
  84.    for(i=0;i<8;i++)
  85.    {
  86.      dat<<=1;
  87.      SCL =1;
  88.      delay_nus(1);
  89.      dat|=SDA;
  90.      SCL=0;
  91.         delay_nus(1);   
  92.    }
  93.     return dat;
  94. }


  95. void Single_Write_bh1750(uchar REG_Address)
  96. {
  97.     bh1750_start();                 
  98.     bh1750_SendByte(SlaveAddress);   
  99.     bh1750_SendByte(REG_Address);
  100.     bh1750_stop();         
  101. }
  102. void Multiple_Read_bh1750()
  103. {   uchar i;       
  104.     bh1750_start();                     
  105.     bh1750_SendByte(SlaveAddress+1);
  106.     for (i=0;i<3;i++)               
  107.     {
  108.         BUF[i] = bh1750_RecvByte();  
  109.         if (i==3)
  110.         {
  111.           bh1750_sendACK(1);
  112.         }
  113.         else  
  114.         {     
  115.             bh1750_sendACK(0);   
  116.         }  
  117.      }
  118.     bh1750_stop();                     
  119.    delay_nms(10);
  120. }

  121. void init_bh1750()
  122. {
  123.   iicinit();
  124.    Single_Write_bh1750(0x01);  
  125. }


  126. uint zhaodu()
  127. {
  128.         Single_Write_bh1750(0x01);
  129.     Single_Write_bh1750(0x10);
  130.          delay_nms(360);
  131.     Multiple_Read_bh1750();
  132.     dis_data=BUF[0];
  133.     dis_data=(dis_data<<8)+BUF[1];
  134.        
  135.         return(dis_data);   

  136. }

复制代码




  1. /***************bh1750.h*******************************/

  2. #ifndef __bh1750_H__
  3. #define __bh1750_H__


  4. #define uchar unsigned char
  5. #define uint unsigned int       
  6. #define        SlaveAddress   0x46



  7. #define SCL P0_0
  8. #define SDA P0_1

  9. #define SDA_OUT P0DIR |= 0x01;      
  10. #define SDA_IN  P0DIR &=~0x01;

  11. #define SCL_OUT P0DIR |= 0x02;      
  12. #define SCL_IN  P0DIR &=~0x02;

  13. void iicinit();
  14. void init_bh1750();
  15. void bh1750_start();               
  16. void bh1750_stop();               
  17. void bh1750_sendACK(uint ack);      
  18. uint  bh1750_RecvACK();            
  19. void bh1750_SendByte(uchar dat);   
  20. uchar bh1750_RecvByte();
  21. void  Single_Write_bh1750(uchar REG_Address);
  22. uchar Single_Read_bh1750(uchar REG_Address);
  23. void  Multiple_Read_bh1750();


  24. uint zhaodu();            




  25. #endif
复制代码



  1. void delay_nus(unsigned int n)
  2. {
  3.   unsigned int i,j;
  4.   for(i=0;i<n;i++)
  5.     for(j=0;j<10;j++);
  6. }

  7. void delay_nms(unsigned int n)
  8. {
  9.   unsigned int i,j;
  10.   for(i=0;i<n;i++)
  11.     for(j=0;j<535;j++);
  12. }
复制代码

  1. #ifndef __delay_h__
  2. #define __delay_h__


  3. //void delay(unsigned int t);
  4. //void delay_1ms(void);
  5. void delay_nus(unsigned int n);
  6. void delay_nms(unsigned int n);
  7. #endif
复制代码



/***************************************/   


/*      波特率:115200bps              */
/***************************************/
#include<ioCC2540.h>
#include <string.h>
#include "bh1750.h"
#include "delay.h"
#define  uint  unsigned int
#define  uchar unsigned char

//定义LED的端口
#define LED1 P1_0
#define LED2 P1_1

//函数声明
//void Delay_ms(uint);
void initUART(void);
void UartSend_String(uint *Data,int len);

uint Txdata[1]={1}; //存放"Hello BlueTooth4.0 "共19个字符串

/****************************************************************
    延时函数                                                                                       
****************************************************************/
//void Delay_ms(uint n)
//{
//  uint i,j;
//  for(i=0;i<n;i++)
//    for(j=0;j<535;j++);
//}

void IO_Init()
{
  P1DIR = 0x01;                        //P1_0,P1_1 IO方向输出
  LED1 = 0;
}

/****************************************************************
   串口初始化函数                               
****************************************************************/
void InitUART(void)
{
  PERCFG = 0x00;                      //位置1 P0口
  P0SEL = 0x0c;                              //P0_2,P0_3用作串口(外部设备功能)
  P2DIR &= ~0XC0;                     //P0优先作为UART0
  
  U0CSR |= 0x80;                      //设置为UART方式
  U0GCR |= 11;                                       
  U0BAUD |= 216;                      //波特率设为115200
  UTX0IF = 0;                         //UART0 TX中断标志初始置位0
}
/****************************************************************
串口发送字符串函数                       
****************************************************************/
void UartSend_String(uint *Data,int len)
{
  int j;
  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}
/****************************************************************
主函数                                               
****************************************************************/
void main(void)
{
   
  CLKCONCMD &= ~0x40;               //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);          //等待晶振稳定为32M
  CLKCONCMD &= ~0x47;               //设置系统主时钟频率为32MHZ   
  // delay_nms(400);
  IO_Init();
  InitUART();
//Delay_ms(200);

  init_bh1750();
// strcpy(Txdata,"Hello BlueTooth4.0 ");     //将发送内容copy到Txdata;
  while(1)
   {
     Txdata[0]=zhaodu();

    UartSend_String(Txdata,1); //串口发送数据
          // Delay_ms(200);           //标志发送状态
    // LED1=~LED1;
     delay_nms(200);
   //  delay_nus(1);
//     // Delay_ms(200);
//    delay_nus(4);
   }
}


数据通过串口发送出去,波特率为115200,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
一颗小石头
1楼-- · 2020-01-15 00:38
本帖最后由 一颗小石头 于 2015-10-26 17:33 编辑

补发一下附件,编译器为8.20版本的
prow
2楼-- · 2020-01-15 01:54
根据你的标题是看不出任何信息的。
你要确认是蓝牙部分出错还是传感器部分出错。
i2c通讯是否正常?是否接收到ack?发送完命令后是否有等待180ms转换时间?
蓝牙单独使用是否好使?
一颗小石头
3楼-- · 2020-01-15 03:26
本帖最后由 一颗小石头 于 2015-10-26 17:37 编辑

1、蓝牙模块单独可以使用,
2、可能是iic部分出现错误,但是我看不出来,
3、等待了180ms,其他延时都大于4us(用示波器测过的)
4、发送完数据后接收到的ack为0.
liude2006
4楼-- · 2020-01-15 08:21
一颗小石头 发表于 2015-10-26 17:32
1、蓝牙模块单独可以使用,
2、可能是iic部分出现错误,但是我看不出来,
3、等待了180ms,其他延时都大于4 ...

你好,请问你的光照传感器数据读取出来了吗?能否共享一下?

一周热门 更多>