1

我在尝试将我的光传感器 (MAX44009) 与 I2C 连接时遇到问题。我会解释我做了什么,我希望有人能帮助我。

我将这个连接卡连接到我的 XMC4400 的 HMI 端口上,带有 80 个端口。

在此处输入图像描述

我已根据此表连接了传感器。SCA - pin37 SCL - pin38 GND - pin 80 3.3 - pin 3.3V of XMC4400

然后,我尝试为我的光传感器调整 I2C Master 示例(可在 DAVE 教程中获得)。我创建了一个具有以下设置的 I2C 主应用程序:

在此处输入图像描述

在此处输入图像描述

我的 main.c 是这样的:

代码:

#include <DAVE.h>        


 #define IO_EXPANDER_ADDRESS  (0x4A)

 uint8_t tx_buffer[4] = {0x00,0x01,0x02,0x03};

 volatile uint8_t tx_completion_0 = 0;
 volatile uint8_t rx_completion_0 = 0;

 /* Transmit callback handling */
 void tx_callback_0(void)
 {
   tx_completion_0 = 1;
 }

/* Receive callback handling */
 void rx_callback_0(void)
 {
   rx_completion_0 = 1;
 }

/* Delay */
 void delay(uint32_t counter)
 {
    volatile uint32_t cnt = counter;
    while(--cnt);
 }

 /*
  * For this demo  the HMI satellite board for the XMC45 CPU board is required.
  * It communicates with the IO expander (U360: PCA9502) found in the mentioned satellite board.
  * The demo implements a binary counter using the LEDs attached to the IO expander.
  *
  */
 int main(void)
 {

  DAVE_Init();

  uint8_t received_data;
  uint8_t counter = 0;

  /* Write data to reset the LEDs through the IO EXPANDER: DIR and 0xFF */
  I2C_MASTER_Transmit(&I2C_MASTER_0,true,IO_EXPANDER_ADDRESS,&tx_buffer[1],2,false);
  while(tx_completion_0 == 0);
  tx_completion_0 = 0;



  while(counter < 255)
  {

    tx_buffer[3] = ~counter;
    counter++;

    /* Write data to set the STATE of the IO EXPANDER */
    I2C_MASTER_Transmit(&I2C_MASTER_0,true,IO_EXPANDER_ADDRESS,&tx_buffer[3],2,false);
    while(tx_completion_0 == 0){

      tx_callback_0();

    }
    tx_completion_0 = 0;

    /* Receive the data from the IO EXPANDER */
    I2C_MASTER_Receive(&I2C_MASTER_0,true,IO_EXPANDER_ADDRESS,&received_data,2,true,true);
    printf("%d", received_data);
    while(rx_completion_0 == 0){
        rx_callback_0();
    }
    rx_completion_0 = 0;
    /* Check if the received  data is correct*/
    if(tx_buffer[3] != received_data)
    {
     // while(1);
    }
    /* Delay to make visible the change */
    delay(0xfffff);
  }
  while(1);
  return 0;
 }

我认为我的回调函数不起作用,因为每次执行一个 I2C 函数时它都会停止。在这种情况下是在第 108 行。另外,有时它会给我一个错误/警告:

0x00 上没有可用的源。

import smbus
import time

# Get I2C bus
bus = smbus.SMBus(1)

# MAX44009 address, 0x4A(74)
# Select configuration register, 0x02(02)
#       0x40(64)    Continuous mode, Integration time = 800 ms
bus.write_byte_data(0x4A, 0x02, 0x40)

time.sleep(0.5)

# MAX44009 address, 0x4A(74)
# Read data back from 0x03(03), 2 bytes
# luminance MSB, luminance LSB
data = bus.read_i2c_block_data(0x4A, 0x03, 2)

# Convert the data to lux
exponent = (data[0] & 0xF0) >> 4
mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F)
luminance = ((2 ** exponent) * mantissa) * 0.045

# Output data to screen
print "Ambient Light luminance : %.2f lux" %luminance

当我使用树莓派时,我有这个 Python 代码可以在我的传感器灯上正常工作,我尝试在 XMC 上做同样的事情,但没有成功。我希望你能帮助我。

4

1 回答 1

-1

首先,我建议在您的代码周围构建一个 if 语句,例如

DAVE_STATUS_t init_status;
init_status = DAVE_Init();

if(init_status == DAVE_STATUS_SUCCESS)
{
  ... code
}

有了这个,您可以检查 DAVE APP 是否已正确初始化。如果是这种情况,您可以进一步研究回调问题。如果不是,那就是配置的问题。

您可以通过在 APP Dependency 窗口 -> APP Help 中的 I2C Master 字段上右击找到更多代码示例。APP提供的方法有例子。

于 2018-02-15T22:10:41.403 回答