恩智浦官方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
恩智浦是这么描述这个函数的: