I2C的IO端口初始化

10个帖子/ 0新
最后一篇
jamesleo-konka
离线
最后一次露面:4年1个月前
加入:2017-01-22 02:42
I2C的IO端口初始化

嗨,对话
我正在研究firewerals_demo,并找到UART的GPIO端口/引脚的初始化。
但是没有代码,做i2c的gpio端口/引脚。
我应该初始化I2C的GPIO端口/引脚吗?如何 ?或者我错过了什么?

谢谢

关键词:
设备:
mt_dialog.
离线
最后一次露面:3个月1周前
职员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

请在Peripherals_demo \ config \ default目录中查看gpio_setup.h文件,在那里,您将找到每个gpio的定义,然后在periph_setup.c中找到peirph_setup()函数您将通过hw_gpio_configure找到引脚的初始化() 功能。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年1个月前
加入:2017-01-22 02:42
嗨mt_dialog,

嗨mt_dialog,
对不起,我错过了GPIO配置代码,它们被重新定义为CFG_GPIO_I2C1_SCL_PORT,并使用宏HW_GPIO_PINCONFIG初始化。

谢谢

jamesleo-konka
离线
最后一次露面:4年1个月前
加入:2017-01-22 02:42
嗨mt_dialog,

嗨mt_dialog,
我在Project HRP_Sensor中的Periph_setup中放入以下代码:
// -----------------------------
// ----- I2C端口/引脚配置------ P3.5 = SCL,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。
对于PIN,我们可以将其设置为输入/输出(带/无拉,或PUSH_PULL或SPEED),然后我们设置备用功能。
为什么我应该在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中,有许多线才能in init i2c设备,如:
i2c_slave_device(i2c1,bh1750,0x23,hw_i2c_addressing_7b,hw_i2c_speed_fast);

但我找不到BH1750的定义,MEM_24LC256,FM75 ,,,,,,They在AD_I2C_OPEN()中也使用。

谢谢

mt_dialog.
离线
最后一次露面:3个月1周前
职员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

HW_GPIO_CONFIGURE_PIN()包括HW_GPIO_SET_PIN_FUNCT()您可以查看代码或DOXYGEN以获取每个功能的描述。hw_gpio_set_pin_function()足以配置您的引脚,HW_GPIO_CONFIGURE_PIN()执行相同的操作,但如果它将处于活动状态,则此外设置默认状态。关于将UART RX设置为输出和使用两个GPIO函数的原因,以便设置UART的RX,我想在HRP_Sensor项目的Periph_Init()函数中看到它,所以右上方引脚的设置有一个解释,简而言之,这是jlink仿真串口的解决方法。

没有定义,它们只是宏I2C_Slave_device使用的名称,并且在执行此后,您将能够使用它们以便打开适配器。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年1个月前
加入:2017-01-22 02:42
嗨mt_dialog,

嗨mt_dialog,
以下是使用I2C适配器的正确顺序:
1.首先声明I2C设备:
I2C_BUS(I2C1)
i2c_slave_device(i2c1,bme280,0x76,hw_i2c_addressing_7b,hw_i2c_speed_standard);//
I2C_BUS_END.
2.操作I2C设备
i2c_device dev;
静态char wbuf [5] =“test”;
char rbuf [5];
dev = ad_i2c_open(bme280);/ *打开所选设备* /
ad_i2c_bus_acquire(dev);/ *获取访问总线* /
ad_i2c_write(dev,wbuf,sizeof(wbuf));/ *将某些数据同步写入I2C设备* /// - 这将生成启动,发送从地址(W),发送REG地址,写入数据
AD_I2C_READ(DEV,RBUF,SIZEOF(RBUF),100);/ *同步读取来自i2c设备的数据* / // i2c更改方向,生成重启,发送从地址(r),发送reg地址,读取数据,生成停止
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字节,first = reg地址,第二个=数据

谢谢

jamesleo-konka
离线
最后一次露面:4年1个月前
加入: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.
离线
最后一次露面:3个月1周前
职员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

1)是的,您在I2C总线上的设备的分配是正确的。

2)获取设备的句柄当您即将启动事务是正确的(AD_I2C_OPEN(BME280))也是正确的,AD_I2C_BUS_AQUIRE()不是必需的,因为AD_I2C_WRITE()和AD_I2C_READ()执行AIRIES总线和设备以及释放总线和设备。

此外,只要将事项直接获取,因为您想生成重启条件,从总线读取时会生成重启条件,这意味着您必须提供(因此在I2C总线上写入)寄存器的地址您希望阅读,上面的代码我不认为在AD_I2C_WRITE()和AD_I2C_READ()之间生成重新启动条件(在AD_I2C_READ()操作期间在写入和读取读取的读取和读取读取条件)之间产生重新启动条件。在AD_I2C_WRITE和AD_I2C_READ之间,就我所知,应存在停止条件。生成重新启动条件是您在帖子中提及它的位置。

关于你的其他问题:

1)在prvsetuphardware()中的system_init()函数中调用ad_i2c_init(),在pm_system_init()函数中,有一个名为init_adapters()的附加函数,并且从该功能初始化所有启用的适配器。

2)系统将让适配器知道唤醒或启动,只要您已配置它们,适配器将初始化HW,当系统默认情况下启动或唤醒时会发生这种情况。

3)是的,我想你可以做到这一点。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年1个月前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
感谢您的帮助,我的AD_I2C_XX已开始,我得到了I2C端口的输出。
似乎ad_i2c_write()和ad_i2c_read()不能生成重启信号,因为它们都完成了I2C操作的完整步骤:start,从地址(w / r),数据(w / r),,,,,停止。
如果用户使用HW_I2C_XX生成重启信号吗?请告诉我一个示例代码。

谢谢

mt_dialog.
离线
最后一次露面:3个月1周前
职员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

如上所述,通常在您希望从I2C从站读出一个值时生成重启条件(I2C主机将在总线上写入寄存器的地址,以便按顺序发出重新启动开始阅读)。ad_i2c_write()和ad_i2c_read()将执行单独的写入并读取。使用当前的I2C模块,使用68x的装备,您无法写入,然后强制重启条件以便为读取操作写入地址。出于此原因,如上所述,当您的FIFO是EMTPY时,I2C模块将自动生成停止条件,并且在更改操作时重启状态。

所以让我们假设你在从站开始编写数据,你决定你想读取,所以你必须写的奴隶地址,你想在公共汽车上读取,所以你将提供您希望读到I2C FIFO的地址,以免生成停止(请记住您的FIFO是否为空I2C将发送停止条件)。如果您提供了您希望读取模块的I2C从设备的地址,则没有一种方式知道这是一个地址,并且您现在要读取的方式,并将在与数据相同的交易上发送地址,由于您没有从WRITE切换到读取以便生成重启。

总之,我不知道我知道为了强制在I2C上重新启动条件(也许你可以制作一个虚拟读取以强制重启,然后开始正确的阅读事务,写入地址并读取再一次,但这将导致两个重启条件,据我所知,我不确定奴隶如何处理这个问题)虽然我无法看到实际读写和写入之间的停止条件有什么问题?

谢谢mt_dialog.