Датчик света XMC4400 и MAX44009 (I2C)

У меня проблемы с подключением датчика освещенности (MAX44009) к I2C. Я объясню, что я сделал, и я надеюсь, что кто-то может мне помочь.

Я подключаю эту плату подключения к порту HMI моего XMC4400 с 80 портами.

введите описание изображения здесь

Я подключил датчик в соответствии с этой таблицей. SCA - контакт 37 SCL - контакт 38 GND - контакт 80 3,3 - контакт 3,3 В 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, который отлично работает на моем датчике света, когда я использую RasPberry Pi, я пытался сделать то же самое на XMC, но безуспешно. Я надеюсь, что вы можете мне помочь.

1 ответ

Прежде всего, я бы порекомендовал построить оператор if вокруг вашего кода, например

DAVE_STATUS_t init_status;
init_status = DAVE_Init();

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

При этом вы можете проверить, правильно ли инициализировано приложение DAVE. Если это так, вы можете заглянуть дальше в проблему обратного вызова. Если нет, то это проблема с конфигурацией.

Вы можете найти другие примеры кода, щелкнув правой кнопкой мыши в поле "Мастер I2C" в окне "Зависимость приложения" -> "Справка приложения". Есть примеры для методов, представленных в приложении.

Другие вопросы по тегам