2959|5

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于ARM的IIC串行通信的几个问题!请高手解答 急~~~ [复制链接]

程序的主要目的是将0~0xff这256个数按顺序写入到EEPROM(AT24C16)的内部存储单元中,然后再依次将他们读出,并通过实验室板的串口UART0输出到PC机上运行的超级终端上。

程序如下:
#include
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "2410IIC.h"

static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;
static volatile int _iicStatus;
static volatile int _iicMode;
static int _iicPt;

//===================================================================
//       SMDK2410 IIC configuration
//  GPE15=IICSDA, GPE14=IICSCL
//  "Interrupt mode" for IIC block
//===================================================================

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

    Uart_Printf("[ IIC Test(Interrupt) using AT24C16 ]\n");

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

//Enable interrupt
    pISR_IIC = (unsigned)IicInt;
    rINTMOD=0x0;
    rINTMSK &= ~(BIT_IIC);

    //initialize 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 = 0xaf;   //(1<<7) | (0<<6) | (1<<5) | (0xf);

    rIICADD  = 0x10;                    //2410 slave address = [7:1]
    rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)


    Uart_Printf("\nPlease input the start number will be writed to EEPROM: ");
    j = Uart_GetIntNum();
    Uart_Printf("\n");

    Uart_Printf("Start number will be %d\n",j);

       
        //Write the data to EEPROM
    Uart_Printf("Write  test data into AT24C16\n");

    for(i=0;i<256;i++)
    {
        Wr24C080(0xa0,(U8)i,j);
        j++;
            Uart_Printf(".");
    }
    Uart_Printf("\n");            
           
    //Clear the DataBuffer
    for(i=0;i<256;i++)
        data = 0;

        //Read the data from EEPROM
    Uart_Printf("Read test data from AT24C16\n");
   
    for(i=0;i<256;i++)
        Rd24C080(0xa0,(U8)i,&(data));

// printf read data
    for(i=0;i<16;i++)
    {
        for(j=0;j<16;j++)
            Uart_Printf("%2x ",data[i*16+j]);
        Uart_Printf("\n");
    }
   
    rINTMSK |= BIT_IIC;   
    rGPEUP  = save_PE;
    rGPECON = save_E;
}


//*************************[ Wr24C080 ]****************************
void Wr24C080(U32 slvAddr,U32 addr,U8 data)
{
    _iicMode      = WRDATA
    _iicPt        = 0;
    _iicData[0]   = (U32)addr;// 我把U8改成了U32
    _iicData[1]   = data;
    _iicDataCount = 2;
   
    // send control byte
   
    rIICDS   = slvAddr;                 //0xa0 移位寄存器,写使能
    rIICSTAT = 0xf0;                    //MasTx,Start 控制状态寄存器
      //Clearing the pending bit isn't needed because the pending bit has been cleared.
  while(_iicDataCount!=2);//???????为什么一定要这条。
    _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
    }
   
    //end send
    rIICSTAT = 0xd0;                    //Stop MasTx condition 1101
    rIICCON  = 0xaf;                    //Resumes IIC operation.
    Delay(1);                           //Wait until stop condtion is in effect.
       //Write is completed.
}
        
//**********************[ Rd24C080 ] ***********************************
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        = addr;//slvAddr;
    rIICSTAT      = 0xb0;               //MasRx,Start
    rIICCON       = 0xaf;               //Resumes IIC operation.   
    while(_iicDataCount!=-1);

    *data = _iicData[1];
}
以下问题不明白:
1 _iicDataCount = 2;while(_iicDataCount!=2);//???????为什么要有这条语句。跟static volatile int _iicDataCount;有关系?另外还有 _iicStatus =0x100; while(_iicStatus==0x100);
2声明的这几个 静态全局变量作用在哪里呢?
3,写入函数void Wr24C080(U32 slvAddr,U32 addr,U8 data)怎么把数据写进去了?跪求解答~~~~~~~~~~~~~
此帖出自ARM技术论坛

最新回复

麻烦多贴点 解决了说说  详情 回复 发表于 2009-6-17 22:57
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
引用 1 楼 zyzhang365 的回复:
貌似还有中断处理程序吧。贴处理的只是部分代码。

貌似还有中断处理程序吧。贴出来的只是部分代码。
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1 _iicDataCount = 2;while(_iicDataCount!=2);//???????为什么要有这条语句。跟static volatile int _iicDataCount;有关系?另外还有 _iicStatus =0x100; while(_iicStatus==0x100);

_iicDataCount应该是个数据计算器,while(_iicDataCount!=2);的意思是直到计数器的值为2时才执行下面的程序,这里是等待作用。_iicStatus =0x100; while(_iicStatus==0x100); 跟 _iicDataCount = 2;while(_iicDataCount!=2);意思差不多。

2声明的这几个 静态全局变量作用在哪里呢?
声明静态就是防止其它模块调用,这里应该也可以不申请为静态。

3,写入函数void Wr24C080(U32 slvAddr,U32 addr,U8 data)怎么把数据写进去了?跪求解答~~~~~~~~~~~~~
对这个函数的参数不是很明白。
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
貌似还有中断处理程序吧。贴处理的只是部分代码。
此帖出自ARM技术论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢两位的回复了,这个问题 我已基本解决,IIC的读写是在中断内部完成的,这两个函数只是发送开始、应答和停止信号的iicDataCount是个数据计算器 ,它是保证数据地址和数据值发送完了。
此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
麻烦多贴点
解决了说说
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表