I2C 通信 BGM121 与 SLWSTK6101C 上的板载 Si7021 (BGScript)
I2C communication BGM121 with onboard Si7021 on SLWSTK6101C (BGScript)
我正在使用 Silicon Laboratories BGM121 蓝牙低功耗模块和 SLWSTK6101C 入门套件。该套件上有一个 RHT 传感器 (Si7021),它连接到板上的 i2c,并通过它连接到模块。
对于示例项目,我直接闪现而无需通过 Simplicity Studio v4 进行编译,它工作正常并且我获得了适当的值。
问题:我必须使用 SiLabs BGScript 语言对模块进行编程。我不能用 C 来做,因为 GCC 还不受支持,而且我没有 IAR 许可证。
我想读出传感器数据(温度)并想通过 BLE 将其发送到 android 应用程序。 BLE 部分不是问题,我构建 services/characteristics 就像它们在 bluetooth.org 上采用的服务中描述的那样。我尝试使用 SiLabs 的 BGScript 示例来测试它是否有效。但是即使是厂商提供的官方SDK BGScript example也不行。
这是我的配置和代码:
<!-- 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 =
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 =
end if
#Flags field -> 0: °C , 1: °F
temperature(0:1)=[=11=]
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
对led程序的调用只是为了测试它是否starts/ends i2c通信。
我发现我从来没有在 "i2c_result" 上取得过成功。所以它没有得到传感器的值。但我不明白为什么。
有什么想法吗?
提前致谢!
已解决。 SiLabs 的支持给了我暗示,他们几天前发布了新的 SDK v2.1。在这个更新的 SDK 中有工作项目。
但是您可以运行旧项目与工作传感器。
BGM121 不像其他板那样为传感器提供固定电源。您必须将 "power-supply-pin" 设置为逻辑 1 才能为传感器供电。其他模块已将传感器静态链接到逻辑 1。
这是通过在 hardware.xml 文件中设置一个额外的 GPIO 来完成的。
<gpio port="D" pin="9" mode="pushpull" out="1" />
或者通过调用
以编程方式设置它
call hardware_configure_gpio(3, 9, hardware_gpio_mode_push_pull, 1)
一切都解决了。现在可以使用传感器了。
我正在使用 Silicon Laboratories BGM121 蓝牙低功耗模块和 SLWSTK6101C 入门套件。该套件上有一个 RHT 传感器 (Si7021),它连接到板上的 i2c,并通过它连接到模块。
对于示例项目,我直接闪现而无需通过 Simplicity Studio v4 进行编译,它工作正常并且我获得了适当的值。
问题:我必须使用 SiLabs BGScript 语言对模块进行编程。我不能用 C 来做,因为 GCC 还不受支持,而且我没有 IAR 许可证。
我想读出传感器数据(温度)并想通过 BLE 将其发送到 android 应用程序。 BLE 部分不是问题,我构建 services/characteristics 就像它们在 bluetooth.org 上采用的服务中描述的那样。我尝试使用 SiLabs 的 BGScript 示例来测试它是否有效。但是即使是厂商提供的官方SDK BGScript example也不行。
这是我的配置和代码:
<!-- 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 =
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 =
end if
#Flags field -> 0: °C , 1: °F
temperature(0:1)=[=11=]
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
对led程序的调用只是为了测试它是否starts/ends i2c通信。
我发现我从来没有在 "i2c_result" 上取得过成功。所以它没有得到传感器的值。但我不明白为什么。
有什么想法吗?
提前致谢!
已解决。 SiLabs 的支持给了我暗示,他们几天前发布了新的 SDK v2.1。在这个更新的 SDK 中有工作项目。
但是您可以运行旧项目与工作传感器。
BGM121 不像其他板那样为传感器提供固定电源。您必须将 "power-supply-pin" 设置为逻辑 1 才能为传感器供电。其他模块已将传感器静态链接到逻辑 1。
这是通过在 hardware.xml 文件中设置一个额外的 GPIO 来完成的。
<gpio port="D" pin="9" mode="pushpull" out="1" />
或者通过调用
以编程方式设置它call hardware_configure_gpio(3, 9, hardware_gpio_mode_push_pull, 1)
一切都解决了。现在可以使用传感器了。