Связь I2C BGM121 с встроенным Si7021 по SLWSTK6101C (BGScript)

Я работаю с Bluetooth-модулем Silicon Laboratories BGM121 и стартовым комплектом SLWSTK6101C. В этом комплекте есть датчик RHT (Si7021), который подключен к i2c на самой плате и через него к модулю.

С примерами проектов я прошил напрямую без компиляции через Simplicity Studio v4, все работает нормально, и я получаю подходящие значения.

Проблема: я должен использовать язык SiLabs BGScript для программирования модуля. Я не могу сделать это с C, потому что GCC еще не поддерживается, и у меня нет лицензии IAR.

Я хочу прочитать данные датчика (температура) и отправить их в приложение для Android через BLE. Часть BLE не проблема, и я создаю сервисы / характеристики, как они описаны в принятых сервисах на bluetooth.org. Я попытался использовать примеры BGScript из SiLabs, чтобы проверить, работает ли он. Но даже официальные примеры SDK BGScript, предоставленные производителем, не будут работать.

Вот моя конфигурация и мой код:

<!-- I2C configuration -->
<!-- Settings: SCL pin is PC11 and SDA pin is PC10 -->
<i2c scl_pin="PC11" sda_pin="PC10"/>

I2C-Код связи:

export dim i2c_result
export dim i2c_len
export dim i2c_buffer(4)
export dim temperature(5)
export dim timeout
export dim data
dim result

const sensor_slave_addr = $40

export procedure sensorRead()

    call led1_on()


    call hardware_write_i2c(0,sensor_slave_addr,1,$f3)

    i2c_result = 1
    timeout = 0
    while (i2c_result != 0) &&  (timeout < 50)
        call hardware_read_i2c(0,sensor_slave_addr,2)(i2c_result,i2c_len,i2c_buffer(0:i2c_len))
        timeout = timeout + 1
        if i2c_result = 0 then
            call led1_off()
        end if
    end while

    call hardware_stop_i2c(0)

    if(timeout < 50) then
        # Check that the I2C was read properly and the while loop didn't 
        # end because of the timeout.
        # Measurement from the I2C read is in big endian format and must be 
        # converted to little-endian by swapping bytes.
        data = i2c_buffer(0:1) << 8 | i2c_buffer(1:1)
        #call led1_off()
    else
        data = $25
    end if


    #Flags field -> 0: °C , 1: °F
    temperature(0:1)=$00
    temperature(1:4)=float(data*1757/65536-469, -1)



    call gatt_server_write_attribute_value(temperature_char, 0, 5, temperature(0:5))(result)
    call gatt_server_send_characteristic_notification($FF, temperature_char, 5, temperature(0:5))(result)

    end

Вызовы светодиодных процедур предназначены только для тестирования, если он запускает / заканчивает связь i2c.

Я узнал, что я никогда не добьюсь успеха на "i2c_result". Таким образом, он не получает значения датчика. Но я не понимаю почему.

Есть идеи?

Заранее спасибо!

1 ответ

Решение

Это было решено. Поддержка SiLabs дала мне понять, что они выпустили новый SDK v2.1 несколько дней назад. В этом обновленном SDK находятся рабочие проекты.

Но вы можете запустить старые проекты, чтобы с работающим датчиком.

BGM121 не обеспечивает фиксированный источник питания для датчика, как другие платы. Вы должны установить "штырь источника питания" в логическую единицу 1 для питания датчика. Другие модули связали датчик статически с логикой 1.

Это делается путем установки дополнительного GPIO в файле hardware.xml.

<gpio port="D" pin="9" mode="pushpull" out="1" />

Или установить его программно с помощью вызова

call hardware_configure_gpio(3, 9, hardware_gpio_mode_push_pull, 1)

Это решило все. Теперь можно использовать датчик.

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