Датчик света 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" в окне "Зависимость приложения" -> "Справка приложения". Есть примеры для методов, представленных в приложении.