day07 IIC实战

来源:互联网 发布:美国最高法院知乎 编辑:程序博客网 时间:2024/06/08 15:29
回顾:
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启动图标,点击打开即可
 
原创粉丝点击