zoukankan      html  css  js  c++  java
  • S3C2440 I2C总线控制

    概述:话不多说,直接上图

    多主机IIC总线控制(IICCON):

    IIC控制总线状态(IICSTAT):

    IIC总线地址(IICADD):

    IIC发送,接收总线寄存器(IICDS)

    IIC总线控制寄存器:

    源码如下:

    void Rd24C080(U32 slvAddr,U32 addr,U8 *data)
    {
     _iicMode      = SETRDADDR;
     _iicPt        = 0;
     _iicData[0]   = (U8)addr;
     _iicDataCount = 1;

     rIICDS   = slvAddr;
     rIICSTAT = 0xf0;                    //MasTx,Start 
     //Clearing the pending bit isn't needed because the pending bit has been cleared.
     while(_iicDataCount!=-1);

     _iicMode      = RDDATA;
     _iicPt        = 0;
     _iicDataCount = 1;
       
     rIICDS        = slvAddr;
     rIICSTAT      = 0xb0;               //MasRx,Start
     rIICCON       = 0xaf;               //Resumes IIC operation.  
     while(_iicDataCount!=-1);

     *data = _iicData[1];

    void Wr24C080(U32 slvAddr,U32 addr,U8 data)
    {
     _iicMode      = WRDATA;
     _iicPt        = 0;
     _iicData[0]   = (U8)addr;
     _iicData[1]   = data;
     _iicDataCount = 2;
       
     rIICDS   = slvAddr;                 //0xa0
     rIICSTAT = 0xf0;                    //MasTx,Start
     //Clearing the pending bit isn't needed because the pending bit has been cleared.
       
     while(_iicDataCount!=-1);

     _iicMode = POLLACK;

     while(1)
     {
      rIICDS     = slvAddr;
      _iicStatus = 0x100;
      rIICSTAT   = 0xf0;              //MasTx,Start
      rIICCON    = 0xaf;              //Resumes IIC operation.
              
      while(_iicStatus==0x100);
              
      if(!(_iicStatus&0x1))
       break;                      //When ACK is received
     }
     rIICSTAT = 0xd0;                    //Stop MasTx condition
     rIICCON  = 0xaf;                    //Resumes IIC operation.
     Delay(1);                           //Wait until stop condtion is in effect.
     //Write is completed.
    }
           

    void Test_Iic(void)
    {
     unsigned int i,j,save_E,save_PE;
     static U8 data[256];

     Uart_Printf(" IIC Test(Interrupt) using AT24C02 ");

     save_E   = rGPECON;
     save_PE  = rGPEUP;
     rGPEUP  |= 0xc000;                  //Pull-up disable
     rGPECON |= 0xa00000;                //GPE15:IICSDA , GPE14:IICSCL

     pISR_IIC = (unsigned)IicInt;
     rINTMSK &= ~(BIT_IIC);

     //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
     // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz
     rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);

     rIICADD  = 0x10;                    //2440 slave address = [7:1]
     rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)
     rIICLC = (1<<2)|(1);      // Filter enable, 15 clocks SDA output delay       added by junon
       
     Uart_Printf("Write test data into AT24C02 ");

     for(i=0;i<256;i++)
      Wr24C080(0xa0,(U8)i,i);
              
     for(i=0;i<256;i++)
      data[i] = 0;

     Uart_Printf("Read test data from AT24C02 ");
       
     for(i=0;i<256;i++)
      Rd24C080(0xa0,(U8)i,&(data[i]));

            //Line changed 0 ~ f
     for(i=0;i<16;i++)
     {
      for(j=0;j<16;j++)
       Uart_Printf("%2x ",data[i*16+j]);
      Uart_Printf(" ");
     }
     rINTMSK |= BIT_IIC;   
     rGPEUP  = save_PE;
     rGPECON = save_E;
    }

    void main()

    {

    Test_Iic();

    }

  • 相关阅读:
    二叉树的递归遍历框架:
    springmvc 有哪些优点呢?
    springmvc 和 struts2 有哪些区别?
    三层架构 和 MVC 设计模式有哪些区别呢?
    软件测试各个阶段通常完成什么工作?各个阶段的结果文件是什么?包括什么内容?
    软件测试的策略是什么?
    软件产品质量特性是什么?
    软件配置管理的作用?软件配置包括什么?
    什么是软件测试?软件测试的目的与原则
    软件生存周期及其模型是什么?
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3297285.html
Copyright © 2011-2022 走看看