I2C的IO端口初始化

10个职位/0个新职位
最后一篇文章
孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
I2C的IO端口初始化

嗨,Dialog
我正在学习外设演示,并找到UART的GPIO端口/引脚初始化。
但是I2C的GPIO端口/引脚没有代码。
我应该初始化I2C的GPIO端口/引脚吗?如何?或者我错过了什么?

谢谢

关键词:
设备:
MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

请检查peripherals\u demo\config\default目录中的gpio\u setup.h文件,在那里可以找到所使用的每个gpio的定义,然后在peripherals\u setup.c中可以找到hw\u gpio\u configure()函数对管脚的初始化。

谢谢你的对话

孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
嗨,MT\u Dialog,

嗨,MT\u Dialog,
抱歉,我错过了GPIO配置代码,它们被重新定义为CFG\u GPIO\u I2C1\u SCL\u PORT,并使用宏HW\u GPIO\u PINCONFIG进行初始化。

谢谢

孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
嗨,MT\u Dialog,

嗨,MT\u Dialog,
我在项目hrp\u sensor的periph\u设置中输入了以下代码:
//------------------------------
//-----I2C端口/引脚配置------P3.5=SCL,P1.2=SDA--------
硬件gpio配置引脚(硬件gpio端口3,硬件gpio引脚5,硬件gpio模式输出,硬件gpio功能gpio,true);
硬件gpio配置引脚(硬件gpio端口1,硬件gpio引脚2,硬件gpio模式输入,硬件gpio功能gpio,true);

硬件gpio\设置\引脚\功能(硬件gpio\端口\ 3、硬件gpio\引脚\ 5、硬件gpio\模式\输出、硬件gpio\功能\ I2C\ SCL);
硬件gpio\设置\引脚\功能(硬件gpio\端口\ 1、硬件gpio\引脚\ 2、硬件gpio\模式\输入\上拉、硬件gpio\功能\ I2C \ SDA);
//------------------------------
对吗?
我对两个init函数有点困惑:hw\u gpio\u configure\u pin、hw\u gpio\u set\u pin\u函数。
对于管脚,我们可以将其设置为输入/输出(带/不带拉、推拉或速度),然后设置交替功能。
为什么要在两个函数中设置两次模式(输入/输出)?

为什么将RX引脚设置为输出:
硬件gpio配置引脚(硬件gpio端口2,硬件gpio引脚3,硬件gpio模式输出,硬件gpio功能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中,有许多行用于初始化I2C设备,如:
I2C\从设备(I2C1,BH1750,0x23,HW\ U I2C\ U寻址\U 7B,HW\ U I2C\ U速度\U快);

但是我找不到BH1750,MEMè24LC256,FM75,,,,,--它们也用于adèi2cèu open()中。

谢谢

MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

hw\u gpio\u configure\u pin()包含hw\u gpio\u set\u pin\u函数()您可以查看代码或doxygen以了解每个函数的描述。hw\u gpio\u set\u pin\u函数()足以配置管脚,hw\u gpio\u configure\u pin()做同样的事情,但是如果管脚处于活动或非活动状态,它会另外设置管脚的默认状态。关于将UART RX设置为输出的原因,以及使用两个gpio函数来设置UART的RX,我想您在hrp\u sensor项目的periph\u init()函数中看到了这一点,因此,在pin设置的正上方有一个简单的解释,这是Jlink模拟串行端口的解决方法。

没有定义,它们只是宏I2C\u SLAVE\u设备使用的名称,这样做之后,您就可以使用它们来打开适配器。

谢谢你的对话

孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
嗨,MT\u Dialog,

嗨,MT\u Dialog,
I2C适配器的使用顺序是否正确:
1首先声明I2C设备:
I2C\ U总线(I2C1)
I2C\从设备(I2C1、BME280、0x76、HW\ U I2C\ U寻址\U 7B、HW\ U I2C\ U速度\U标准)//
I2C总线端
2操作I2C设备
i2c\U设备开发;
static char wbuf[5]=“测试”;
char-rbuf[5];
dev=ad_i2c_open(BME280);/*打开所选设备*/
ad_i2c_bus_acquire(dev);/*获取对总线的访问*/
ad_i2c_write(dev,wbuf,sizeof(wbuf));/*将一些数据同步写入i2c设备*//--这将生成START、send SLAVE address(W)、send reg address、write data
ad_i2c_read(dev,rbuf,sizeof(rbuf),100);/*从i2c设备同步读取数据*///i2c改变方向,生成重启,发送从属地址(R),发送注册地址,读取数据,生成停止
ad_i2c_bus_release(dev);/*释放i2c
ad_i2c_close(dev);/*关闭所选设备*/

另一个问题:
1什么时候使用ad\u i2c\u init()?
2启动任务后是否应调用ad\u i2c\u xx?上电复位(无任务运行)后是否可以进行I2C设备初始化?
4要将一个数据写入I2C设备的寄存器,请参阅以下内容:
ad_i2c_write(dev,wbuf,2);//2字节,第一个=寄存器地址,第二个=数据

谢谢

孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
Hi MT\u对话框

Hi MT\u对话框
谢谢。
宏太多了,不容易分析/跟踪源代码。

示例项目的外围设备演示会让用户混淆硬件i2c和ad i2c,尤其是eeprom中的。hw_i2c_xx和ad_i2c_xx同时使用。

用户何时调用ad\u i2c\u init()?我找不到调用ad\u i2c\u init()的代码。

詹姆斯

MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

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

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

2) 当您要开始一个事务时,获取设备的句柄是正确的(ad\u i2c\u open(BME280))也是正确的,ad\u i2c\u bus\u aquire()不是必需的,因为ad\u i2c\u write()和ad\u i2c\u read()执行总线和设备的获取以及总线和设备的释放。

另外,由于您想生成一个重新启动条件,所以为了把事情弄清楚,重新启动条件是在您从总线读取时生成的,这意味着您必须提供(因此在i2c总线上写入)您想读取的寄存器的地址,我认为上面的代码不会在adïi2cïwrite()和adïi2cïread()之间产生重新启动条件(在adïi2cïread()操作期间,在总线上的写入和读取之间触发重新启动条件)。据我所知,在adèi2cè写入和adèi2cè读取之间应该有一个停止条件。重新启动条件是在您在帖子中提到的地方生成的。

关于您的其他问题:

1) 在prvSetupHardware()中的system\u init()函数期间调用ad\u i2c\u init(),在pm\u system\u init()函数中还有一个名为init\u adapters()的附加函数,从该函数中初始化所有启用的适配器。

2) 系统将让适配器知道唤醒或通电,并且只要您配置了适配器,适配器就会初始化硬件,这在系统默认情况下通电或唤醒时发生。

3) 是的,我想你能做到。

谢谢你的对话

孔卡
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
嗨,MT\u Dialog,

嗨,MT\u Dialog,
感谢您的帮助,我的广告i2c\uxx已经开始,我得到了i2c端口的输出。
似乎adèi2cèwrite()和adèi2cèread()无法生成重新启动信号,因为它们都完成了i2c操作的完整步骤:启动、从属地址(W/R)、数据(W/R)、、、、、停止。
用户是否应该使用hw\u i2c\u xx生成重启信号?请给我一个样本代码。

谢谢

MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

如上所述,当您想从I2C从机读取一个值时,通常会生成重新启动条件(I2C主机会在总线上写入它想读取的寄存器地址,然后发出重新启动以开始读取)。ad\ U i2c\ U write()和ad\ U i2c\ U read()将分别执行写入和读取操作。使用68x配备的当前I2C模块,您将无法写入然后强制重新启动以写入读操作的地址。原因是,如前所述,I2C模块将在其FIFO为emtpy时自动生成停止条件,并在您更改操作时自动生成重新启动条件。

假设你开始在你的从机上写数据,你决定要读,所以你必须在总线上写你想读的从机的寄存器地址,因此,您将提供您想要读取到I2C FIFO的地址,以便不生成停止(请记住,如果您的FIFO为空,I2C将发送停止条件)。如果您提供要读取的I2C从机的地址,则模块无法知道这是一个地址,并且您现在要读取该地址,并且将在同一事务上发送该地址作为数据,因为您没有为了生成重新启动而从写切换到读。

总之,我不知道有什么方法可以强制I2C重新启动(也许你可以做一个虚拟读取来强制重新启动,然后启动正确的读取事务,写入地址并再次读取,但据我所知,这将导致两种重新启动条件,我不确定任何从机将如何处理这一点),尽管我无法看到实际读写之间的停止条件有什么问题?

谢谢你的对话