NXP I.MX6ULL SDK I2C研读(一)

恩智浦官方SDK中的裸机I2C驱动中所有函数列出如下,共计32个,其中主机相关函数17个,从机相关函数12个,剩余3个为使能和失能interrupt和I2C block(I2C_Enable实际也有失能I2C block的功能)。

1.I2C_DisableInterrupts

如下,我认为改写版本也可以,只能说官方的更严谨,既然是Disable了,肯定是从able状态变到了disable了。而改写版本包含了able到disable,disable到diable两种行为,不严谨,但是效果我认为是一样的。

2.I2C_Enable

这个函数名是Enable,但是逻辑里却包含了disable的分支。这样做我觉得容易让人误解。

3.I2C_EnableInterrupts

如下,if条件实际是mask和另一个mask进行&运算,结果一定是真,也就是if可以不要,不清楚为啥要加个if判断,个人感觉没必要。

4.I2C_MasterClearStatusFlags

I2SR中,我们可写的只有bit1和bit4,其余6个都是只读的。I2C_MasterInit调用I2C_MasterClearStatusFlags的时候,statusMask值为18,即bit4和bit2为1,也证明了我们只能对bit4和bit2写操作。

5.I2C_MasterDeinit

如下,首先失能I2C,然后,判断:

①.假如之前没定义过FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL(没定义过肯定就没执行过相应的失能时钟的行为了)

②.时钟现在还是工作状态。

以上两条件有一个满足就 掐掉时钟。

6.I2C_MasterGetDefaultConfig

不太理解为什么加上assert。剩下是设置默认波特率和使能I2C外设。但是此函数并没有在其他函数中有被调用。

 7.I2C_MasterGetStatusFlags

如下,就是取I2SR寄存器的值。

8.I2C_MasterInit

直接拿流程图来说明。

9.I2C_MasterReadBlocking

细节在图中已标出。个人认为假读和最后两字节的处理是重点。

10.I2C_MasterRepeatedStart

函数逻辑及函数实现如下:

 

11.I2C_MasterSetBaudRate

12.I2C_MasterStart

具体函数实现如下,和发送重复起始信号,少了“我是不是主机”的判断,默认使用该函数时,自己是主机。

 13.I2C_MasterStop

将控制寄存器的相应位置为相应状态即可发送停止命令:

①MSTA:Slave Mode

②MTX:Receive

③TXAK:Transmit acknowledge enable

14.I2C_MasterTransferAbort

恩智浦是这么描述这个函数的:

Aborts an interrupt non-blocking transfer early. This API can be called at any time when an interrupt non-blocking transfer initiates to abort the transfer early.
具体函数实现如下:
15. I2C_MasterTransferBlocking
流程图如下。
具体函数实现如下:
16.I2C_MasterTransferCreateHandle
NXP描述此函数:Initializes the I2C handle which is used in transactional functions.  具体实现如下:
17.I2C_MasterTransferGetCount
NXP描述此函数:Gets the master transfer status during a interrupt non-blocking transfer.
 
Updating......
posted @ 2021-01-20 20:11  昆山皮皮虾  阅读(433)  评论(0编辑  收藏  举报