I2C的IO端口初始化

10个职位/ 0
最后发表
jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
I2C的IO端口初始化

嗨,对话框
我学习peripherals_demo,找到UART的GPIO端口的初始化/针。
但是这些没有代码做I2C的GPIO口/针。
我应该做I2C的GPIO端口的初始化/针吗?如何?或者我错过什么吗?

谢谢

关键词:
设备:
MT_dialog
离线
最后看到:2个月5天前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

请检查gpio_setup。peripherals_demo \ config \ h文件默认目录,你会发现每个gpio的定义使用然后peirph_setup periph_setup()函数。c你会发现初始化的别针hw_gpio_configure()函数。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
嗨MT_Dialog,

嗨MT_Dialog,
对不起,我错过了的配置代码,重新定义为CFG_GPIO_I2C1_SCL_PORT,使用宏HW_GPIO_PINCONFIG来初始化。

谢谢

jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
嗨MT_Dialog,

嗨MT_Dialog,
我把下面的代码在periph_setup项目hrp_sensor:
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - - - i2c端口/销配置- - - - - - P3.5 = sci, P1.2 = SDA - - - - - - - - - -
hw_gpio_configure_pin (HW_GPIO_PORT_3 HW_GPIO_PIN_5、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_GPIO, true);
hw_gpio_configure_pin (HW_GPIO_PORT_1 HW_GPIO_PIN_2、HW_GPIO_MODE_INPUT_PULLUP HW_GPIO_FUNC_GPIO, true);

hw_gpio_set_pin_function (HW_GPIO_PORT_3 HW_GPIO_PIN_5、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_I2C_SCL);
hw_gpio_set_pin_function (HW_GPIO_PORT_1 HW_GPIO_PIN_2、HW_GPIO_MODE_INPUT_PULLUP HW_GPIO_FUNC_I2C_SDA);
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
这是对的吗?
我有点困惑2 init函数:hw_gpio_configure_pin hw_gpio_set_pin_function。
销,我们可以把它作为输入/输出(有/没有拉,push_pull或速度),然后设置alternal功能。
我为什么要设置模式(输入/输出)两次2功能?

为什么RX销设置为输出:
hw_gpio_configure_pin (HW_GPIO_PORT_2 HW_GPIO_PIN_3、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_GPIO, 1);
hw_gpio_set_pin_function (HW_GPIO_PORT_2 HW_GPIO_PIN_3、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_UART2_RX);吗?

在platform_devices。h,有很多线init I2C设备,如:
I2C_SLAVE_DEVICE (I2C1 BH1750 0 x23、HW_I2C_ADDRESSING_7B HW_I2C_SPEED_FAST);

但是我找不到BH1750 definning, MEM_24LC256 FM75,,,,,它们用于ad_i2c_open ()。

谢谢

MT_dialog
离线
最后看到:2个月5天前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

hw_gpio_configure_pin()包括hw_gpio_set_pin_function()你可以看看代码或doxygen的每个函数的描述。hw_gpio_set_pin_function()就足以配置您的别针,在hw_gpio_configure_pin()做同样的事,但另外设置一个默认的销如果它要活跃不活跃。原因相关的UART RX作为输出的设置和使用的两个函数来设置RX的UART我假设您看到这个periph_init hrp_sensor项目的()函数,所以,销的正上方设置有一个解释,简而言之,这是解决Jlink模拟串行端口。

他们只是没有定义名称使用的宏I2C_SLAVE_DEVICE这样做后,你将能够使用它们为了打开适配器。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
嗨MT_Dialog,

嗨MT_Dialog,
以下是正确的序列使用I2C适配器:
1。首先声明I2C设备:
I2C_BUS (I2C1)
I2C_SLAVE_DEVICE (I2C1 BME280 0 x76, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_STANDARD);/ /
I2C_BUS_END
2。I2C操作设备
i2c_device开发;
静态字符wbuf[5] =„测试”;
char rbuf [5];
dev = ad_i2c_open (BME280);* / / *打开选定的设备
ad_i2c_bus_acquire (dev);* / / *获取访问总线
ad_i2c_write (dev, wbuf sizeof (wbuf));/ *写同步数据到I2C设备* / / /——这将产生开始,把奴隶地址(W),发送注册地址写入数据
ad_i2c_read (dev, rbuf sizeof (rbuf), 100);/ *同步I2C数据读取设备* / / / I2C改变方向,生成重启,把奴隶地址(R),发送注册地址,读取数据,生成停止
ad_i2c_bus_release (dev);/ *释放I2C
ad_i2c_close (dev);/ * * /关闭选定的设备

另一个问题:
1。当使用ad_i2c_init () ?
2。启动任务后ad_i2c_xx应该叫吗?我能做I2C设备上电复位后初始化任务运行(不)?
4所示。写一个数据到I2C设备的登记,我可以参考以下几点:
ad_i2c_write (dev wbuf 2);/ / 2字节,第一=注册地址,第二=数据

谢谢

jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
嗨MT_dialog

嗨MT_dialog
非常感谢。
有太多的宏和不容易分析/跟踪源代码。

示例项目peripherals_demo让用户与hw_i2c_xx混淆和ad_i2c_xx,尤其是在eeprom_24xx256。c。hw_i2c_xx和ad_i2c_xx都同时使用。

当将用户调用ad_i2c_init () ?我不觉得代码调用ad_i2c_init ()。

詹姆斯

MT_dialog
离线
最后看到:2个月5天前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

您调用的命令序列取决于您正在使用的SDK,例如最新SDK:

1)是的,作业的I2C总线上的设备是适当的。

2)的处理设备,当你即将开始一个事务是适当的(ad_i2c_open (BME280))也是正确的,这个ad_i2c_bus_aquire ad_i2c_write以来()不是必需的()和ad_i2c_read()执行公共汽车的本事和设备也释放总线和设备。

同时,直接把事情因为你想生成一个重启状态,启动条件生成从总线读取时,这意味着你将不得不提供(因此写在i2c总线)寄存器的地址,你想读,上面的代码我不认为ad_i2c_write之间产生一个启动条件()和ad_i2c_read()之间的条件触发重新启动(写和读在ad_i2c_read总线()操作)。ad_i2c_write和ad_i2c_read之间应该有一个停止条件我可以告诉。生成的启动条件就是你提及你的博文。

关于你的其他问题:

1)ad_i2c_init system_init期间调用()()函数在prvSetupHardware(),在pm_system_init()函数有一个额外的函数叫做init_adapters()和从这个函数使适配器被初始化。

2)系统将让适配器知道醒来或电源和适配器将初始化hw只要你有配置,当系统是驱动或默认情况下醒来。

3)是的,我认为你可以这样做。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2周前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
谢谢你的帮助,我和ad_i2c_xx已经开始了I2C的输出端口。
似乎,ad_i2c_write()和ad_i2c_read()不能生成启动信号,因为他们两人做了I2C的完整步骤操作:首先,奴隶地址(W / R),数据(W / R),,,,停止。
用户应该使用hw_i2c_xx生成启动信号?请给我一个示例代码。

谢谢

MT_dialog
离线
最后看到:2个月5天前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

正如上面提到的,通常生成的启动条件当你想读值从I2C奴隶(I2C总线上的大师写的地址注册,喜欢阅读,然后重启问题为了开始阅读)。ad_i2c_write()和ad_i2c_read()将执行一个独立写作和阅读。与当前I2C模块68 x是装备你不会写,然后强制重新启动条件为了写地址读操作。原因是,正如前面提到的I2C模块将自动产生停止条件当FIFO emtpy,重启当你改变操作条件。

我们假设您开始编写数据在你的奴隶,你决定,你想读,所以你要写的寄存器地址的奴隶,你会喜欢阅读,在公共汽车上,你将提供的地址,你想读I2C FIFO为了不产生一个停止(记住如果你的FIFO空I2C将发送一个停止条件)。如果您提供的地址I2C奴隶,你想读模块没有办法知道,这是一个地址,你现在愿意阅读,并将发送地址相同的事务数据,因为你没有从写阅读为了生成一个重启。

总之没有办法,我知道为了强制重启I2C条件(或许你可以让一个虚拟阅读为了强制重启,然后开始适当的阅读事务,再写地址和阅读,但这将导致两个启动条件,据我所知,我不确定任何奴隶将如何处理,虽然我不能够看到有什么问题实际读写之间的停止条件?

由于MT_dialog