回顾:
1.链接脚本
.lds
链接器使用
段的内容和起始地址
语法
三个内容:
起始地址
第一个文件
入口函数
2.I2C总线
面试题:谈谈对I2C总线的理解
2.1.常用的硬件通信方式
GPIO/UART/I2C/SPI/1-Wire
2.2.I2C的定义
7个字
两线式
SCL
CPU
SDA
双方
诗
上拉电阻
串行
一个时钟传输1bit
一次一字节
高位传输
总线
连接多个外设
此时此刻务必画出简要的硬件连接示意图
2.3.看图提三个问题
CPU如何定位到某个要访问的外设?
CPU如何通过两根信号线和外设进行数据通信?
SDA和SCL如何搭配使用?
答:答案在I2C总线协议中
I2C总线协议的细节在I2C外设的芯片手册中的时序图中
谈I2C总线协议
1.协议涉及的概念
START/STOP/R/W/设备地址/读写设备地址/ACK
此时此刻画出START和STOP时序图
举例子说明设备地址的确认
2.CPU访问I2C外设的过程
举例子边说边画框框圈圈图说明即可
以CPU读取MMA8653的ID为例
3.SDA和SCL的配合
四个字:低放高取
大招:举例子画出最终的硬件操作时序图
以CPU向HMC6352发送休眠命令0x53为例,画出波形
4.挑衅:I2C出现问题,只需拿示波器抓波形,就能够
通过波形定位问题
3.实战演练I2C总线的硬件访问操作
面试题:谈谈对ARM裸板编程的认识
3.1.提需求:S5P6818读取MMA8653三轴加速度传感器的ID
并且将ID信息打印输出
3.2.需求分析
下位机读取MMA8653的ID并且打印输出
3.3.掌控MMA8653的硬件信息
粗看
MMA8653在下位机的连接位置
细看
1.看原理图
MMA8653引脚SCL连接到S5P6818的GPIOD6/SCL2
MMA8653引脚SDA连接到S5P6818的GPIOD7/SDA2
此时此刻画出一个简要的硬件连接示意图,参见mma8653.bmp
2.看图明确CPU核最终访问MMA8653的流程
CPU核以软件地址指针的形式访问I2C控制器
内部的一大堆寄存器,本质就是给I2C控制器
发送命令
I2C控制器接收到命令以后,I2C控制器硬件上
自动操作SCL和SDA两根信号线,具体的操作
过程严格按照MMA8653的硬件操作时序图进行:
START->0x1D<<1|0->(ACK)->0x0D->(ACK)
->START->0x1D<<1|1->(ACK)->(0x5A)
->NACK->STOP
也就是以上时序将来I2C控制器硬件自动帮你完成
CPU核最终根据时序将ID(0x5A)获取到!
结论:接下来搞定I2C控制器以及内部的
一大堆寄存器即可
2.打开S5P6818芯片手册,找到I2C控制器的章节
掌握I2C控制器的操作特性:
2.1.S5P6818支持3路I2C总线
MMA8653连接到第三路
2.2.S5P6818支持四种操作模式
主机发送(CPU给外设发送数据)
主机接收(CPU从外设接收数据)
从机发送(S5P6818作为外设的时候)
从机接收(S5P6818作为外设的时候)
2.3.CPU向外设发送数据操作流程P919
1.配置I2C控制器为发送模式
2.将MMA8653的设备地址写入I2CDS寄存器
3.将0xF0写入I2CSTAT寄存器
产生START信号
I2CDS中的数据开始向SDA数据线传输
4.I2CDS中的数据传输完毕,外设给CPU
一个ACK信号以后,也会产生一个中断信号
所以:判断ACK是否到来,只需判断中断信号
是否到来即可!
5.如果CPU继续发送数据
CPU只需将数据再次放到I2CDS寄存器中
6.然后清楚中断信号到来的标志bit位
7.紧接着I2CDS寄存器的数据硬件上放到
SDA数据线上传输
8.如果I2CDS寄存器中的数据发送完毕
外设会给CPU一个ACK信号以后,也会
产生一个中断信号,只需判断此中断
信号即可判断数据是否传输正常
9.如果CPU要想继续发送数据
重复5-8步骤即可
10.如果CPU结束数据的发送
向寄存器I2CSTAT写0xD0
清楚中断到来的标志BIT位
发送一个STOP信号
2.4.CPU从外设接收数据的流程
1.配置I2C控制器为接收模式
2.把MMA8653的设备地址写入I2CDS寄存器
3.向I2CSTAT寄存器写0xB0,生成START信号
4.I2CDS寄存器中保存的设备地址开始在SDA上传输
5.I2CDS寄存器中的数据发送完毕,外设
给CPU一个ACK信号以后,也会产生一个
中断信号,软件只需判断是否有中断信号
产生来判断数据是否发送完毕
6.CPU从I2CDS寄存器中获取外设发送来的数据
7.清楚中断标志位
8.硬件上SDA数据线继续将下一个新的
数据自动放到I2CDS寄存中
9.如果SDA数据线上的数据放到I2CDS结束
会产生一个中断信号
如果有中断信号产生,CPU可以继续读取数据
10.如果CPU要重复读取数据,只需重复5~9
11.如果CPU结束数据的读取
向I2CSTAT寄存器写0x90
清楚中断标志
产生一个STOP信号
2.5.相关重要的寄存器信息如下:
I2CCON:配置寄存器
基地址:0xC00A6000
BIT[6]=1
已知:PCLK=200MHz
I2C CLK=PCLK/256
I2C CLK=200MHz/256
BIT[3:0]=0xF;
SCL:宁可慢,不能快,一块就完蛋
SCL=I2C CLK/(BIT[3:0]+1)
SCL=200MHz/256/(BIT[3:0]+1)
BIT[4]:
当读此BIT时:
=0:中断没有到来
=1:中断到来
当写此BIT时:
=0:清除中断标志
不能写1
明确:
1.当数据发送完毕,会产生中断
2.当数据到来,会产生中断
BIT[5]=1 使能中断信号
BIT[7]=0 不可以发送ACK信号给外设
=1 可以发送ACK信号给外设
具体时序具体操作
BIT[8]
读此BIT位
=0:没有中断
写此BIT位
=1:清除中断
I2CSTAT:状态寄存器
基地址:0xC00A6004
BIT[0]=0:ACK接收到
=1:ACK没有接收到
BIT[4]=1 使能RX和TX功能
BIT[5]:
写此BIT位:
=1:产生START信号
=0:产生STOP信号
BIT[7:6]=10:CPU作为接收模式
=11:CPU作为发送模式
I2CDS:数据寄存器
基地址:0xC00A600C
BIT[7:0]:保存接收或者发送的数据
将来硬件上自动将寄存器中的
数据发送到SDA上
将来硬件上自动从SDA上获取数据
保存在BIT[7:0]
I2CLR:配置寄存器
基地址:0xC00A6010
BIT[1:0]=01 延时为5clocks(1clock=1/200MHz)
BIT[2]=1 使能滤波器
GPIODALTFN0:复用功能选择寄存器
将GPIOD6配置为SCL2
将GPIOD7配置为SDA2
I2CCLKENB:I2C时钟使能寄存器P302
基地址:0xC000B000
BIT[3]=1 使能PCLK
以上寄存器操作完毕,发现还是不行,于是与在
S5P6818芯片手册中各种搜索"I2C"关键字
得到一下寄存器:
I2CIPRESET:I2C控制器复位寄存器
基地址:0xC0012000
BIT[22]=0 复位I2C控制器
5.掌控硬件信息,编写MMA8653裸板程序
参考代码:ftp://ARM/day07/shell-mma8653v2.rar
实施步骤:
mkdir /opt/arm/day07/
cp /opt/arm/day06/1.0 /opt/arm/day07/1.0 -fr
vim iic.h
vim iic.c
vim mma8653.h
vim mma8653.c
vim itoa.h
vim itoa.c
vim cmd.c
vim Makefile 添加iic.o mma8653.o itoa.o
make
下位机测试
Shell#mmaid //获取MMA8653的ID信息
6.案例:添加mmaxyz命令,读取XYZ三轴方向的加速度值
并且打印
X方向的加速度值保存在片内寄存器:0x01和0x02
0x01寄存器的8个bit位作为X轴方向加速度值的高8位
0x02寄存器的bit7,bit6作为X轴方向加速度值的低2位
Y方向的加速度值保存在片内寄存器:0x03和0x04
0x03寄存器的8个bit位作为Y轴方向加速度值的高8位
0x04寄存器的bit7,bit6作Y轴方向加速度值的低2位
Z方向的加速度值保存在片内寄存器:0x05和0x06
0x05寄存器的8个bit位作为Z轴方向加速度值的高8位
0x06寄存器的bit7,bit6作为Z轴方向加速度值的低2位
standby mode:省电/待机模式
active mode:正常工作模式
ubuntu系统安装sourceinsight的步骤:
1.安装wine
sudo apt-get install wine
2.先用wine来安装sourceinsight
wine Si3569Setup.exe //开始各种点击安装
期间提示输入序列码:SN.txt文件中有
安装最后会提示创建一个源码工程,可以创建
也可以不创建
3.下一次打开,只需在桌面搜索工具中输入"sourceinsight"
即可看到sourceinsight启动图标,点击打开即可
1.链接脚本
.lds
链接器使用
段的内容和起始地址
语法
三个内容:
起始地址
第一个文件
入口函数
2.I2C总线
面试题:谈谈对I2C总线的理解
2.1.常用的硬件通信方式
GPIO/UART/I2C/SPI/1-Wire
2.2.I2C的定义
7个字
两线式
SCL
CPU
SDA
双方
诗
上拉电阻
串行
一个时钟传输1bit
一次一字节
高位传输
总线
连接多个外设
此时此刻务必画出简要的硬件连接示意图
2.3.看图提三个问题
CPU如何定位到某个要访问的外设?
CPU如何通过两根信号线和外设进行数据通信?
SDA和SCL如何搭配使用?
答:答案在I2C总线协议中
I2C总线协议的细节在I2C外设的芯片手册中的时序图中
谈I2C总线协议
1.协议涉及的概念
START/STOP/R/W/设备地址/读写设备地址/ACK
此时此刻画出START和STOP时序图
举例子说明设备地址的确认
2.CPU访问I2C外设的过程
举例子边说边画框框圈圈图说明即可
以CPU读取MMA8653的ID为例
3.SDA和SCL的配合
四个字:低放高取
大招:举例子画出最终的硬件操作时序图
以CPU向HMC6352发送休眠命令0x53为例,画出波形
4.挑衅:I2C出现问题,只需拿示波器抓波形,就能够
通过波形定位问题
3.实战演练I2C总线的硬件访问操作
面试题:谈谈对ARM裸板编程的认识
3.1.提需求:S5P6818读取MMA8653三轴加速度传感器的ID
并且将ID信息打印输出
3.2.需求分析
下位机读取MMA8653的ID并且打印输出
3.3.掌控MMA8653的硬件信息
粗看
MMA8653在下位机的连接位置
细看
1.看原理图
MMA8653引脚SCL连接到S5P6818的GPIOD6/SCL2
MMA8653引脚SDA连接到S5P6818的GPIOD7/SDA2
此时此刻画出一个简要的硬件连接示意图,参见mma8653.bmp
2.看图明确CPU核最终访问MMA8653的流程
CPU核以软件地址指针的形式访问I2C控制器
内部的一大堆寄存器,本质就是给I2C控制器
发送命令
I2C控制器接收到命令以后,I2C控制器硬件上
自动操作SCL和SDA两根信号线,具体的操作
过程严格按照MMA8653的硬件操作时序图进行:
START->0x1D<<1|0->(ACK)->0x0D->(ACK)
->START->0x1D<<1|1->(ACK)->(0x5A)
->NACK->STOP
也就是以上时序将来I2C控制器硬件自动帮你完成
CPU核最终根据时序将ID(0x5A)获取到!
结论:接下来搞定I2C控制器以及内部的
一大堆寄存器即可
2.打开S5P6818芯片手册,找到I2C控制器的章节
掌握I2C控制器的操作特性:
2.1.S5P6818支持3路I2C总线
MMA8653连接到第三路
2.2.S5P6818支持四种操作模式
主机发送(CPU给外设发送数据)
主机接收(CPU从外设接收数据)
从机发送(S5P6818作为外设的时候)
从机接收(S5P6818作为外设的时候)
2.3.CPU向外设发送数据操作流程P919
1.配置I2C控制器为发送模式
2.将MMA8653的设备地址写入I2CDS寄存器
3.将0xF0写入I2CSTAT寄存器
产生START信号
I2CDS中的数据开始向SDA数据线传输
4.I2CDS中的数据传输完毕,外设给CPU
一个ACK信号以后,也会产生一个中断信号
所以:判断ACK是否到来,只需判断中断信号
是否到来即可!
5.如果CPU继续发送数据
CPU只需将数据再次放到I2CDS寄存器中
6.然后清楚中断信号到来的标志bit位
7.紧接着I2CDS寄存器的数据硬件上放到
SDA数据线上传输
8.如果I2CDS寄存器中的数据发送完毕
外设会给CPU一个ACK信号以后,也会
产生一个中断信号,只需判断此中断
信号即可判断数据是否传输正常
9.如果CPU要想继续发送数据
重复5-8步骤即可
10.如果CPU结束数据的发送
向寄存器I2CSTAT写0xD0
清楚中断到来的标志BIT位
发送一个STOP信号
2.4.CPU从外设接收数据的流程
1.配置I2C控制器为接收模式
2.把MMA8653的设备地址写入I2CDS寄存器
3.向I2CSTAT寄存器写0xB0,生成START信号
4.I2CDS寄存器中保存的设备地址开始在SDA上传输
5.I2CDS寄存器中的数据发送完毕,外设
给CPU一个ACK信号以后,也会产生一个
中断信号,软件只需判断是否有中断信号
产生来判断数据是否发送完毕
6.CPU从I2CDS寄存器中获取外设发送来的数据
7.清楚中断标志位
8.硬件上SDA数据线继续将下一个新的
数据自动放到I2CDS寄存中
9.如果SDA数据线上的数据放到I2CDS结束
会产生一个中断信号
如果有中断信号产生,CPU可以继续读取数据
10.如果CPU要重复读取数据,只需重复5~9
11.如果CPU结束数据的读取
向I2CSTAT寄存器写0x90
清楚中断标志
产生一个STOP信号
2.5.相关重要的寄存器信息如下:
I2CCON:配置寄存器
基地址:0xC00A6000
BIT[6]=1
已知:PCLK=200MHz
I2C CLK=PCLK/256
I2C CLK=200MHz/256
BIT[3:0]=0xF;
SCL:宁可慢,不能快,一块就完蛋
SCL=I2C CLK/(BIT[3:0]+1)
SCL=200MHz/256/(BIT[3:0]+1)
BIT[4]:
当读此BIT时:
=0:中断没有到来
=1:中断到来
当写此BIT时:
=0:清除中断标志
不能写1
明确:
1.当数据发送完毕,会产生中断
2.当数据到来,会产生中断
BIT[5]=1 使能中断信号
BIT[7]=0 不可以发送ACK信号给外设
=1 可以发送ACK信号给外设
具体时序具体操作
BIT[8]
读此BIT位
=0:没有中断
写此BIT位
=1:清除中断
I2CSTAT:状态寄存器
基地址:0xC00A6004
BIT[0]=0:ACK接收到
=1:ACK没有接收到
BIT[4]=1 使能RX和TX功能
BIT[5]:
写此BIT位:
=1:产生START信号
=0:产生STOP信号
BIT[7:6]=10:CPU作为接收模式
=11:CPU作为发送模式
I2CDS:数据寄存器
基地址:0xC00A600C
BIT[7:0]:保存接收或者发送的数据
将来硬件上自动将寄存器中的
数据发送到SDA上
将来硬件上自动从SDA上获取数据
保存在BIT[7:0]
I2CLR:配置寄存器
基地址:0xC00A6010
BIT[1:0]=01 延时为5clocks(1clock=1/200MHz)
BIT[2]=1 使能滤波器
GPIODALTFN0:复用功能选择寄存器
将GPIOD6配置为SCL2
将GPIOD7配置为SDA2
I2CCLKENB:I2C时钟使能寄存器P302
基地址:0xC000B000
BIT[3]=1 使能PCLK
以上寄存器操作完毕,发现还是不行,于是与在
S5P6818芯片手册中各种搜索"I2C"关键字
得到一下寄存器:
I2CIPRESET:I2C控制器复位寄存器
基地址:0xC0012000
BIT[22]=0 复位I2C控制器
5.掌控硬件信息,编写MMA8653裸板程序
参考代码:ftp://ARM/day07/shell-mma8653v2.rar
实施步骤:
mkdir /opt/arm/day07/
cp /opt/arm/day06/1.0 /opt/arm/day07/1.0 -fr
vim iic.h
vim iic.c
vim mma8653.h
vim mma8653.c
vim itoa.h
vim itoa.c
vim cmd.c
vim Makefile 添加iic.o mma8653.o itoa.o
make
下位机测试
Shell#mmaid //获取MMA8653的ID信息
6.案例:添加mmaxyz命令,读取XYZ三轴方向的加速度值
并且打印
X方向的加速度值保存在片内寄存器:0x01和0x02
0x01寄存器的8个bit位作为X轴方向加速度值的高8位
0x02寄存器的bit7,bit6作为X轴方向加速度值的低2位
Y方向的加速度值保存在片内寄存器:0x03和0x04
0x03寄存器的8个bit位作为Y轴方向加速度值的高8位
0x04寄存器的bit7,bit6作Y轴方向加速度值的低2位
Z方向的加速度值保存在片内寄存器:0x05和0x06
0x05寄存器的8个bit位作为Z轴方向加速度值的高8位
0x06寄存器的bit7,bit6作为Z轴方向加速度值的低2位
standby mode:省电/待机模式
active mode:正常工作模式
ubuntu系统安装sourceinsight的步骤:
1.安装wine
sudo apt-get install wine
2.先用wine来安装sourceinsight
wine Si3569Setup.exe //开始各种点击安装
期间提示输入序列码:SN.txt文件中有
安装最后会提示创建一个源码工程,可以创建
也可以不创建
3.下一次打开,只需在桌面搜索工具中输入"sourceinsight"
即可看到sourceinsight启动图标,点击打开即可