ARM功能手机
——疯壳·开发板系列
I2C教程
![1.png 1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190700zd1znufvduzxmigp.png)
图1
第一节I2C硬件电路
将P12与P13配置为I2C的两个接口即可,P12与P13已通过排针引出,如下图所示:
![2.0.png 2.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190718vahdsz1ussazykqq.png)
![2.1.png 2.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190725sacku9nznu9bj8zi.png)
图2
第二节 I2C
2.1 I2C介绍
I2C总线是一个为系统中电路通信提供支持的可编程控制总线,它是一个软件定义的两线通信协议。
两线I2C串行接口包括一个串行数据线(SDA)和一个串行时钟线(SCL);
支持两种通信速率,标准模式(0~100Kb/s)和快速模式(小于等于400Kb/s);
时钟同步;
32字节的发送接收FIFO;
主机发送与接收操作;
7或10位地址,7或10为混合格式发送;
块发送模式;
默认从地址为0x055;
中断或者轮询操作模式;
可编程的数据线保持时间;
2.2 寄存器介绍
I2C相关的寄存器比较多,所以我们只介绍常用的寄存器,其它的可以参考官方数据手册AD14580_DS_v3.1.pdf,位于目录:..\WT开发板\硬件资料。
2.2.1 I2C控制寄存器
![3.png 3.png](https://static.assets-stash.eet-china.com/forum/202209/05/190736n3ratcsaiwtlvcvt.png)
图3
15:7位:保留不使用;
6位:I2C从设备使能位,’0’表示从设备使能,’1’表示从设备不可用,该位不一定要软件设置,但是要保证如果该位为’0’则该寄存器的第0位也为’0’;
5位:当作为主设备时,是否发送重启条件,’0’表示不可以,’1’表示可以;
4位:作为主设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;
3位:作为从设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;
2:1位:I2C通信速度选择,1表示标准速度(100Kbit/s),2表示快速(400Kbit/s);
0位:I2C主设备使能,’0’表示主设备不可用,’1’表示主设备使能,要保证如果该位为’1’则该寄存器的第6位也为’1’;
2.2.2 I2C目标地址寄存器
![4.0.png 4.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190747yxrp20fr4zfv0z7c.png)
![4.1.png 4.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190756bv44t441a2exatp0.png)
图4
15:12位:保留不使用;
11位:该位决定软件是否进行广播或者开始字节命令,’0’表示忽略第10位GC_OR_START并且正常使用IC_TAR;
10位:如果第11位设置为’1’,则该位表示控制器是否进行广播或开始字节命令,’0’表示发送广播地址,之后只能进行写操作,如果进行读操作则导致TX_ABRT置位,控制器一直停留在广播模式,直到第11位被清除,’1’表示发送开始字节;
9:0位:这是主设备发送的目标地址,如果发送广播则该位被忽略,CPU只需要写一次这些位;注意如果目标地址与从设备地址相同则存在回路,但是FIFO为主从共用,所以完全回路是可行的,只支持单方向的回路,一个主设备不能给自己发送数据只能发送给从设备。
2.2.3 I2C接收发送数据缓存与命令寄存器
![5.0.png 5.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190807m9ixg9vij9ghu9vk.png)
![5.1.png 5.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190814h7yyii5b62i34arn.png)
图5
15:9位:保留不使用;
8位:读写控制位,作为从设备时不能控制方向,只能作为主设备时使用,’0’表示写,’1’表示读;
7:0位:存储I2C总线上发送或接收的数据,如果你正在操作该寄存器并且要进行读操作则该位被忽略,如果你读该寄存器则该位存储的是接收到的数据。
2.2.4 I2C清除TX_ABRT中断
![6.png 6.png](https://static.assets-stash.eet-china.com/forum/202209/05/190823tkma2950ag1u6k66.png)
图6
15:1位:保留不使用;
0位:清除发送异常停止位,读该位则清除发送异常停止中断位,和发送异常停止源寄存器位。同时发送FIFO从刷新/复位状态中释放出来,可以允许更多写入。
2.2.5 I2C使能寄存器
![7.0.png 7.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190832na1y4e7ya66a2478.png)
![7.1.png 7.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190839xggpgips4siiuuea.png)
图7
15:1位:保留不使用;
0位:控制器使能位;
2.2.6 I2C状态寄存器
![8.0.png 8.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190852yftf8qd7dftumuhd.png)
![8.1.png 8.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190859h5qbspjnq7xys11x.png)
图8
15:7位:保留不使用;
6位:判断从设备是否活动;
5位:判断主设备是否活动;
4位:判断接收FIFO是否全满;
3位:判断接收FIFO是否为空;
2位:判断发送FIFO是否全满;
1位:判断发送FIFO是否为空;
0位:判断I2C模块是否活动。
2.2.7 I2C接收FIFO数目寄存器
![9.png 9.png](https://static.assets-stash.eet-china.com/forum/202209/05/190909nsdyzy606sgel4g6.png)
图9
15:6位:保留不使用;
5:0位:接收FIFO可以接收多少字节。
2.2.8 I2C发送异常终止源寄存器
![10.0.png 10.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190917p99t84otx2tnb90r.png)
![10.1.png 10.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190926wjzzdy0c0cb9nnsn.png)
图10
15位:当主设备需要发送数据时,却进入读数据状态;
14位:当发送数据时,从设备丢失总线;
13位:当从设备要接收数据时,FIFO中已经有一些数据;
12位:失去仲裁;
11位:当主设备不可用时,用户进行主设备的操作;
10位:重启不可用,并且主设备在10位地址模式下发送读命令;
9位:重启不可用,但是用户发送一个开始字节;
8位:重启不可用,但是用户试图在高速模式下发送数据;
7位:主设备已经发送了一个开始字节,并且开始字节被确认;
6位:主设备在高速模式下,并且被确认;
5位:主设备控制器广播之后进行读操作;
4位:主设备发送广播,但是没有从设备确认;
3位:只有主设备有效,主设备已经发送地址,并确认,但是发送数据得不到确认信号;
2位:主设备使用10位地址模式,10位地址的第二个字节没有被任何从设备确认;
1位:主设备使用10位地址模式,10位地址的第一个字节没有被任何从设备确认;
0位:主设备使用7位地址模式,但是没有被任何从设备确认。
2.3 寄存器配置讲解
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
#define I2C_CON_REG (* ( volatile uint16*)0x50001300)
#define I2C_TAR_REG (* ( volatile uint16*)0x50001304)
#define I2C_DATA_CMD_REG (* ( volatile uint16*)0x50001310)
#define I2C_CLR_TX_ABRT_REG (* ( volatile uint16*)0x50001354)
#define I2C_ENABLE_REG (* ( volatile uint16*)0x5000136C)
#define I2C_STATUS_REG (* ( volatile uint16*)0x50001370)
#define I2C_RXFLR_REG (* ( volatile uint16*)0x50001378)
#define I2C_TX_ABRT_SOURCE_REG (* ( volatile uint16*)0x50001380)
启动I2C模块的时钟:CLK_PER_REG |= 0x0020;
I2C的初始化寄存器配置:
先关闭I2C控制器, I2C_ENABLE_REG=0x00;
设置为主模式,关闭从模式,可以重复开始,速度设置为快速,地址为7位模式(0x0000000001100101), I2C_ CON _REG =0x0065;
设置目标设备地址为0x51, I2C_TAR_REG =0x51;
打开I2C控制器, I2C_ENABLE_REG=0x01;
等待控制器准备好,while( (I2C_STATUS_REG & 0x20) != 0 );
读取地址为0x98处的一个字节,先发送地址I2C_DATA_CMD_REG = 0x98;等待发送完毕while((I2C_STATUS_REG&0x0002)==0);发送读指令I2C_DATA_CMD_REG = 0x0100; 等待发送完毕while((I2C_STATUS_REG&0x0004)==0);之后等待数据接收完毕while(I2C_RXFLR_REG == 0);读取接收缓冲区的数据即为接收数据rx_data = I2C_DATA_CMD_REG;
向地址为0x98处写入一个字节0xaa,先发送地址I2C_DATA_CMD_REG = 0x98;等待发送完毕while((I2C_STATUS_REG&0x0002)==0);发送数据I2C_DATA_CMD_REG = 0xaa; 等待发送完毕while((I2C_STATUS_REG&0x0004)==0);
第三节 I2C实验
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、心率体温模块、3.7V锂电池或Mocro USB线。
将心率体温模块通过杜邦线连接到主控底板上,连接方式如下:
(1)心率体温模块一端主需要使用杜邦线连接心率体温模块的3V3、GND、SCL、SDA四个引脚,如下图所示:
![11.png 11.png](https://static.assets-stash.eet-china.com/forum/202209/05/190939o70o5w5x0o47w7n0.png)
图11
(2)手机主控板一端需要使用杜邦线连接J4的2个引脚以及J10的两个引脚与心率体温模块的引脚一一对应,如下图所示
![12.0.png 12.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/190949qx0u5u75u0991hxb.png)
![12.1.png 12.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/190956fltxwn201l8alzlz.png)
图12
使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
![13.png 13.png](https://static.assets-stash.eet-china.com/forum/202209/05/191008k8ee7s7zteseot8e.png)
图13
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
![14.png 14.png](https://static.assets-stash.eet-china.com/forum/202209/05/191016s8u5bwjkc6obbwjw.png)
图14
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
打开I2C实验的Keil工程i2c_eeprom.uvproj,位于目录:
..\WT_Mobile\1.初级教程\DA14580\5_初级_I2C\projects\target_apps\peripheral_examples\i2c\i2c_eeprom\Keil_5,如下图所示:
![15.png 15.png](https://static.assets-stash.eet-china.com/forum/202209/05/191024i4j1uzhdd7d4j77u.png)
图15
在KEIL中编译源代码,点击DEBUG,然后点击全速运行,在存储温度数据的变量下方打上断点,当程序运行到断点时就会停止。将该变量添加进变量查看窗口中,可以看到温度值,如下图所示:
![16.0.png 16.0.png](https://static.assets-stash.eet-china.com/forum/202209/05/191032op3zoi0lojjwxffo.png)
![16.1.png 16.1.png](https://static.assets-stash.eet-china.com/forum/202209/05/191039kwnnne9j6ncrff6i.png)
![16.2.png 16.2.png](https://static.assets-stash.eet-china.com/forum/202209/05/191046vgf4jcfzmcfgv94v.png)
![16.3.png 16.3.png](https://static.assets-stash.eet-china.com/forum/202209/05/191053e7r7pmrre7igem1n.png)
图16
文件下载请点击:
![](static/image/filetype/pdf.gif)
全部回复 0