一颗小石头 发表于 2015-10-26 16:27:42

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

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

#include<ioCC2540.h>
uchar BUF;               
int dis_data;

void iicinit()
{
   SCL_OUT;
   SDA_OUT;
   SDA = 1;
   delay_nus(1);
   SCL = 1;
   delay_nus(1);
}

void bh1750_start()
{
    SCL_OUT;
    SDA_OUT;
   SDA = 1;
   SCL = 1;   
    delay_nus(1);
    SDA = 0;   
    delay_nus(1);
    SCL = 0;
}

void bh1750_stop()
{
    SCL_OUT;
    SDA_OUT;
   SDA = 0;
   SCL=1;
    delay_nus(1);
    SDA = 1;   
    delay_nus(1);
}

void bh1750_sendACK(uint ack)
{
    SCL_OUT;
    SDA_OUT;
    SDA = ack;
    SCL = 1;   
    delay_nus(1);
    SCL = 0;   
   delay_nus(1);
}

uint bh1750_RecvACK()
{
    SCL_OUT;
    SDA_IN;
    SCL=1;   
    delay_nus(1);
   CY=SDA;
      delay_nus(1);
   SCL=0;
    delay_nus(1);            
    SDA_OUT;
    return CY;

}

void bh1750_SendByte(uchar dat)
{
    uchar i;
    SCL_OUT;
    SDA_OUT;
   for(i=0;i<8;i++)
   {
   dat <<=1;
   SDA=CY;
   SCL=1;
   delay_nus(1);
   SCL=0;
   delay_nus(1);
   }
    bh1750_RecvACK();
}

uchar bh1750_RecvByte()
{
    uchar i;
uchar dat=0;
    SDA=1;
    SDA_IN;
   SCL_OUT;
   for(i=0;i<8;i++)
   {
   dat<<=1;
   SCL =1;
   delay_nus(1);
   dat|=SDA;
   SCL=0;
      delay_nus(1);   
   }
    return dat;
}


void Single_Write_bh1750(uchar REG_Address)
{
    bh1750_start();               
    bh1750_SendByte(SlaveAddress);   
    bh1750_SendByte(REG_Address);
    bh1750_stop();         
}
void Multiple_Read_bh1750()
{   uchar i;       
    bh1750_start();                     
    bh1750_SendByte(SlaveAddress+1);
    for (i=0;i<3;i++)               
    {
      BUF = bh1750_RecvByte();
      if (i==3)
      {
          bh1750_sendACK(1);
      }
        else
      {   
            bh1750_sendACK(0);   
      }
   }
    bh1750_stop();                     
   delay_nms(10);
}

void init_bh1750()
{
iicinit();
   Single_Write_bh1750(0x01);
}


uint zhaodu()
{
        Single_Write_bh1750(0x01);
    Single_Write_bh1750(0x10);
       delay_nms(360);
    Multiple_Read_bh1750();
    dis_data=BUF;
    dis_data=(dis_data<<8)+BUF;
       
        return(dis_data);   

}







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

#ifndef __bh1750_H__
#define __bh1750_H__


#define uchar unsigned char
#define uint unsigned int       
#define        SlaveAddress   0x46



#define SCL P0_0
#define SDA P0_1

#define SDA_OUT P0DIR |= 0x01;      
#define SDA_INP0DIR &=~0x01;

#define SCL_OUT P0DIR |= 0x02;      
#define SCL_INP0DIR &=~0x02;

void iicinit();
void init_bh1750();
void bh1750_start();               
void bh1750_stop();               
void bh1750_sendACK(uint ack);      
uintbh1750_RecvACK();            
void bh1750_SendByte(uchar dat);   
uchar bh1750_RecvByte();
voidSingle_Write_bh1750(uchar REG_Address);
uchar Single_Read_bh1750(uchar REG_Address);
voidMultiple_Read_bh1750();


uint zhaodu();            




#endif





void delay_nus(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
    for(j=0;j<10;j++);
}

void delay_nms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
    for(j=0;j<535;j++);
}


#ifndef __delay_h__
#define __delay_h__


//void delay(unsigned int t);
//void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
#endif



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


/*      波特率:115200bps            */
/***************************************/
#include<ioCC2540.h>
#include <string.h>
#include "bh1750.h"
#include "delay.h"
#defineuintunsigned int
#defineuchar 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}; //存放"Hello BlueTooth4.0\n"共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\n");   //将发送内容copy到Txdata;
while(1)
   {
   Txdata=zhaodu();

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


数据通过串口发送出去,波特率为115200,

一颗小石头 发表于 2015-10-26 16:28:52

本帖最后由 一颗小石头 于 2015-10-26 17:33 编辑

补发一下附件,编译器为8.20版本的

prow 发表于 2015-10-26 17:05:01

根据你的标题是看不出任何信息的。
你要确认是蓝牙部分出错还是传感器部分出错。
i2c通讯是否正常?是否接收到ack?发送完命令后是否有等待180ms转换时间?
蓝牙单独使用是否好使?

一颗小石头 发表于 2015-10-26 17:32:12

本帖最后由 一颗小石头 于 2015-10-26 17:37 编辑

1、蓝牙模块单独可以使用,
2、可能是iic部分出现错误,但是我看不出来,
3、等待了180ms,其他延时都大于4us(用示波器测过的)
4、发送完数据后接收到的ack为0.

liude2006 发表于 2018-5-4 09:48:36

一颗小石头 发表于 2015-10-26 17:32
1、蓝牙模块单独可以使用,
2、可能是iic部分出现错误,但是我看不出来,
3、等待了180ms,其他延时都大于4 ...

你好,请问你的光照传感器数据读取出来了吗?能否共享一下?
页: [1]
查看完整版本: bh1750在cc2540中使用时,读出的数据一直为0xff