在前面的测评中,介绍了GPIO口的使用,并通过输出模式的使用完成了I2C接口OLED屏的显示驱动。这次再通过输入模式的使用来完成I2C接口传感器的使用。
该传感器为检测传感器BH1750,在使用时它与开发板的连接关系为:
SCL----P104
SDA----P107
所用引脚输出高低电平的定义为:
#defineSCL_Set()   rt_pin_write(BSP_IO_PORT_01_PIN_04, PIN_HIGH)
#defineSCL_Clr()   rt_pin_write(BSP_IO_PORT_01_PIN_04, PIN_LOW)
#defineSDA_Set()   rt_pin_write(BSP_IO_PORT_01_PIN_07, PIN_HIGH)
#defineSDA_Clr()   rt_pin_write(BSP_IO_PORT_01_PIN_07, PIN_LOW)
为读取数据所作的相应定义为:
#define IIC_SDA_IN     rt_pin_read(BSP_IO_PORT_01_PIN_07)
在使用过程中,由于要进行输入与输出模式的切换,所定义的输入与输出函数为:
  1. voidIIC_INPUT_MODE_SET()
  2. {
  3.      rt_pin_mode(BSP_IO_PORT_01_PIN_07, PIN_MODE_OUTPUT);
  4. }
  5. voidIIC_OUTPUT_MODE_SET()
  6. {
  7.      rt_pin_mode(BSP_IO_PORT_01_PIN_07, PIN_MODE_INPUT_PULLUP );
  8. }
在以GPIO口模拟I2C发送字节数据时,其函数内容为:
  1. voidBH1750_SendByte(char data)
  2. {
  3.     chari;
  4.     IIC_OUTPUT_MODE_SET();
  5.     SCL_Clr();
  6.     for (i=0;i<8;i++)
  7.     {
  8.         if(data&0x80) SDA_Set();
  9.         elseSDA_Clr();
  10.         data <<= 1;
  11.         SCL_Set();
  12.         SCL_Clr();
  13.     }
  14. }
对寄存器写入控制字的函数为:
  1. voidSingle_Write_BH1750(charREG_Address)
  2. {
  3.     BH1750_Start();
  4.     BH1750_SendByte(SlaveAddress);
  5.     BH1750_RecvACK();
  6.     BH1750_SendByte(REG_Address);
  7.     BH1750_RecvACK();
  8.     BH1750_Stop();
  9. }
进行多字节读取的函数为:
  1. voidMultiple_Read_BH1750()
  2. {
  3.     BH1750_Start();
  4.     BH1750_SendByte(SlaveAddress+1);
  5.     BH1750_RecvACK();
  6.     BUF[0] = BH1750_RecvByte();
  7.     BH1750_SendACK(0);
  8.     BUF[1] = BH1750_RecvByte();
  9.     BH1750_SendACK(1);
  10.     BH1750_Stop();
  11.     rt_thread_mdelay(5);
  12. }
实现检测与显示的函数为:
  1. voidGet_Sunlight_Value()
  2. {
  3.     intdis_data=0;
  4.     float temp;
  5.     chari=0;
  6.     unsignedintsd;
  7.     Single_Write_BH1750(0x01);
  8.     Single_Write_BH1750(0x10);
  9.     rt_thread_mdelay(180);
  10.     Multiple_Read_BH1750();
  11.     for(i=0;i<3;i++)    dis_data=BUF[0];
  12.     dis_data=(dis_data<<8)+BUF[1];
  13.     temp=(float) dis_data/1.2;
  14.     sd=temp;
  15.     if(sd<54612) OLED_ShowNum(0,6,sd,5,16);
  16. }
实现图示效果的程序为:
  1. voidhal_entry(void)
  2. {
  3.    rt_kprintf("\nHello RT-Thread!\n");
  4.    OLED_Init();
  5.    OLED_Clear();
  6.    OLED_ShowString(20,0,"CPK-RA6M4",16);
  7.    OLED_ShowString(20,2,"OLED & BH1750",16);
  8.    OLED_ShowString(0,4,"Sunlight=",16);
  9.    OLED_ShowString(48,6,"lx",16);
  10.    while (1)
  11.    {
  12.        Get_Sunlight_Value();
  13.        rt_thread_mdelay(500);
  14.    }
  15. }
image.png
检测与显示效果图