新唐M051 IIC使用程序

发布者:温馨时光最新更新时间:2014-12-11 来源: 51hei关键字:新唐M051  IIC 手机看文章 扫描二维码
随时随地手机看文章
发一个新唐M051单片机的 IIC使用的程序:
#include "SmartM_M0.h"
#define DEBUGMSG printf
#define EEPROM_SLA              0xA0
#define EEPROM_WR               0x00
#define EEPROM_RD               0x01  
#define I2C_CLOCK               13   
#define PAGE_SIZE               8
/*****************************************
*函数名称:Timed_Write_Cycle
*输    入:无
*输    出:无
*功    能:同步的写周期
******************************************/
void Timed_Write_Cycle(void)                  
{
    while (I2STATUS != 0x18)
    {
        //启动
        I2CON |= STA;                         
        I2CON |= SI;
        while ((I2CON & SI) != SI);
        I2CON &= ((~STA) & (~SI));   
  //设备地址
        I2DAT = EEPROM_SLA | EEPROM_WR;
        I2CON |= SI;
        while ((I2CON & SI) != SI);
    }       
    if (I2STATUS != 0x18)                       //检查应答
    {
     DEBUGMSG("Not ACK returned!");
 }      
    //停止
    I2CON |= STO;
    I2CON |= SI;
    while (I2CON & STO);
}
/*****************************************
*函数名称:I2CInit
*输    入:无
*输    出:无
*功    能:I2C初始化
******************************************/
VOID I2CInit(VOID)
{
    P3_PMD &= ~(Px4_PMD | Px5_PMD);
 P3_PMD |= (Px4_OD | Px5_OD);                //使能I2C0引脚 
    P3_MFP &= ~(P34_T0_I2CSDA | P35_T1_I2CSCL);
 P3_MFP |= (I2CSDA | I2CSCL);        //选择P3.4,P3.5作为I2C0功能引脚      
 APBCLK |= I2C0_CLKEN;                       //使能I2C0时钟
    I2CLK = I2C_CLOCK;                                           
 I2CON |= ENSI;                              //使能I2C
}
/*****************************************
*函数名称:AT24C0XWrite
*输    入:unAddr   写地址
          pucData  写数据
    unLength 写长度
*输    出:TRUE/FALSE
*功    能:AT24C0X写数据
******************************************/
BOOL AT24C0XWrite(UINT32 unAddr,UINT8 *pucData,UINT32 unLength)
{
    UINT32 i;
    I2CON |= STA;              //启动
    I2CON |= SI;                   
    while ((I2CON & SI) != SI);       
    I2CON &= ((~STA)&(~SI));            
    if (I2STATUS != 0x08)            
    {
        DEBUGMSG("I2CStart fail,I2STATUS %02X ",I2STATUS);
  return FALSE;
    } 
    //进入读写控制操作
    I2DAT = EEPROM_SLA | EEPROM_WR;
    I2CON |= SI;
    while ((I2CON & SI) != SI);
    if (I2STATUS != 0x18)             
    {
     DEBUGMSG("I2C write control fail ");       
     return FALSE;
    }
    //写地址
    I2DAT = unAddr;
    I2CON |= SI;
    while ((I2CON & SI) != SI);
    if (I2STATUS != 0x28)             
    {
        DEBUGMSG("I2C write addr fail ");
     return FALSE;
    } 
 //写数据
 for(i=0; i {
     I2DAT = *(pucData+i);
     I2CON |= SI;
     while ((I2CON & SI) != SI);
     if (I2STATUS != 0x28)             
     {
         DEBUGMSG("I2C write data fail ");
      return FALSE;
     } 
 } 
    //停止
    I2CON |= STO;
    I2CON |= SI;
    while (I2CON & STO);        
 //DEBUGMSG("I2C stop ok ");
    Timed_Write_Cycle();                                      
 return TRUE;            
}
/*****************************************
*函数名称:AT24C0XRead
*输    入:unAddr   读地址
          pucData  读数据
    unLength 读长度
*输    出:TRUE/FALSE
*功    能:AT24C0X读数据
******************************************/
BOOL AT24C0XRead(UINT32 unAddr,UINT8 *pucData,UINT32 unLength)
{
 UINT32 i;
    I2CON |= STA;                 //启动
    I2CON |= SI;                      
    while ((I2CON & SI) != SI);        
    I2CON &= ((~STA)&(~SI));            
    if (I2STATUS != 0x08)            
    {
        DEBUGMSG("I2CStart fail,I2STATUS %02X ",I2STATUS); 
  return FALSE;
    }
 //进入读写控制操作 
    I2DAT = EEPROM_SLA | EEPROM_WR;
    I2CON |= SI;
    while ((I2CON & SI) != SI);
    if (I2STATUS != 0x18)             
    {
     DEBUGMSG("I2C write control fail ");      
     return FALSE;
    }
 //写入读地址
    I2DAT = unAddr;
    I2CON |= SI;
    while ((I2CON & SI) != SI);
    if (I2STATUS != 0x28)             
    {
        DEBUGMSG("I2C write addr fail ");
     return FALSE;
    }  
    // 重新启动
    I2CON |= STA;         
    I2CON |= SI;                                
    while ((I2CON & SI) != SI);                 
    I2CON &= ((~STA)&(~SI));    
    if (I2STATUS != 0x10)                       
    {
        DEBUGMSG("I2C repeated start fail ");
  return FALSE;
    }
    //进入读操作 
    I2DAT = EEPROM_SLA | EEPROM_RD;
    I2CON |= SI;
    while ((I2CON & SI) != SI);   
    if (I2STATUS != 0x40)             
    {
        DEBUGMSG("I2C write control fail ");
        while (1);
    }
 //读取数据
 I2CON |= AA;
 for(i=0; i {
     I2CON |= SI;
     while ((I2CON & SI) != SI);
     if (I2STATUS != 0x50)             
     {
         DEBUGMSG("I2C read fail ");
         return FALSE;
     }
  *(pucData+i) = I2DAT; 
 }
    //发送NACK到AT24C02,执行断开连接操作
    I2CON &= (~AA);
    I2CON |= SI;
    while ((I2CON & SI) != SI);
   //停止
    I2CON |= STO;
    I2CON |= SI;
    while (I2CON & STO);                     
 DEBUGMSG("I2C read ok ");
 return TRUE;
}
VOID AT24C02ContinousWrite(UINT32 unAddr,UINT8 *pucData,UINT32 unLength)
{
    UINT32 i,m,n;
 UINT32 unCurWirteCount=0;
 //if(unLength <= 32)
 m = PAGE_SIZE-(unAddr % PAGE_SIZE);   //与当前每页32个字节已剩下多少个字节
 if(unLength <= m)
 {
    AT24C0XWrite(unAddr,pucData,unLength);
 }
 else
 {
    AT24C0XWrite(unAddr,pucData,m);
    unLength -=m;
    unCurWirteCount+=m;
    m = unLength/PAGE_SIZE;
    n = unLength%PAGE_SIZE;
    for(i=0; i    {
        AT24C0XWrite(unAddr+unCurWirteCount,pucData+unCurWirteCount,PAGE_SIZE);
     unCurWirteCount += PAGE_SIZE;
    }
    AT24C0XWrite(unAddr+unCurWirteCount,pucData+unCurWirteCount,n);   
 }  
}
/*****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
  UINT8 i,buf[32];
     Un_Lock_Reg();        //ISP下载时保护FLASH存储器
  PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
  while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
  CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  UartInit(12000000,9600);     //波特率设置为9600bps
  I2CInit(); 
  DEBUGMSG("I2C Test ");
//  while(1)
//  {
     for(i=0; i    {
        buf[i]=0x55;
    }
       DEBUGMSG(" AT24C0XWrite Test ");
    AT24C0XWrite(0,buf,sizeof(buf));  //执行写操作
    Delayms(500);
    //==================================================
       DEBUGMSG("AT24C0XRead Test ");
     for(i=0; i    {
        buf[i]=0x00;
    } 
    AT24C0XRead(0,buf,sizeof(buf));    //执行读操作
    for(i=0; i<10; i++)
    {
     DEBUGMSG("%02X ",buf[i]);     //打印读取的数值  
    } 
    Delayms(500); 
//  }
 while(1);
}
关键字:新唐M051  IIC 引用地址:新唐M051 IIC使用程序

上一篇:新唐M051 UART0使用程序
下一篇:新唐M051 pwm使用程序

推荐阅读最新更新时间:2024-03-16 13:48

WinCE-IIC调试助手(S3C2410)
这两天在调试一款新的硬件平台,它采用的MCU依然是S3C2410。该平台新增了一个RTC模块,采用的芯片是DS1337。这是一个IIC接口的时钟芯片。在开始调试时碰到了一些问题,MCU始终无法与DS1337通讯,走了些弯路,浪费了不少时间。后来发现是IIC的SDA和SCL接反了。为了以后能方便调试2410下的IIC设备,所以决定为2410的WinCE做一个IIC调试助手,以免下次再碰到类似的问题,而多花冤枉时间。 IIC调试助手的主要功能:检测S3C2410 IIC-Bus上的设备,并给出对应的Slave Address。这样,我们就可以快速判断硬件是否有问题。除了侦测设备,同时也要支持读和写的功能。通过选择,能方便控制IIC
[单片机]
WinCE-<font color='red'>IIC</font>调试助手(S3C2410)
TQ2440 学习笔记—— 24、IIC 接口
IIC 接口 IIC (Inter-Integrated Circuit)总线是一种由PHILIPS 公司开发的串行总线,用于连接微控制器及其外围设备,它具有如下特点: 1、只有两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)。 2、每个连接到总线的器件都可以使用软件根据它的唯一的地址来识别。 3、传输数据的设备间是简单的主从关系。 4、主机可以用主机发送器或主机接收器。 5、它是一个真正的多主机总线,两个或多个主机同时发起数据传输时,可以通过冲突检验和仲裁来防止数据被破坏。 6、串行的 8 位双向数据传输,位速率在标准模式下可达100 kbit/s,在快速模式下可达 400 kbit/
[单片机]
TQ2440 学习笔记—— 24、<font color='red'>IIC</font> 接口
简约纳携自主开发的“中国芯”亮相IIC-2012
简约纳电子有限公司将在IIC-2012上展示几大亮点技术与产品:完全自主开发的32位RISC+DSP微处理器内核,无线+定位单芯片解决方案,以及无线安全加密技术。 32位RISC+DSP微处理器内核是一个双线程多发射超标量处理器,混合了CPU和DSP的结构特点,可以同时高效地执行通用程序和数字信号处理应用。无线+定位单芯片解决方案,即在同一个芯片上集成了GSM+GPRS+GPS的双基带处理功能,具有高集成度、功耗低、成本低、可编程等技术优势,其代表产品是SL1300芯片。无线安全加密技术采用5.8GHz频率的近场通信技术(NFC)开发安全芯片,可应用于USB Key、ETC等领域,并能够与SL1300产品一起,为电子车牌、智能交通提
[手机便携]
首款5.8英寸MID高清液晶显示屏亮相IIC
    自MID概念提出以来,一直被业内看作是一款革命性的创新产品,而iPad的热卖可以说是将MID真正带进了人们的生活。按屏幕尺寸来分,MID大概可分为三大类:第一类是显示屏尺寸约为3~4英寸的袖珍型产品;第二类是显示屏尺寸约为4~7英寸的平板型;第三类是上网本,显示屏尺寸约为7~10英寸。其中4.3英寸、5.0英寸和7.0英寸最为常见。但是你见过5.8英寸的MID高清液晶显示屏吗?     在本届IIC-China展会上,沃德富科技(深圳)有限公司展出的高清5.8寸液晶显示屏吸引了很多人的目光,有参观者表示很想拥有这样一种尺寸的显示屏。据该公司工作人员介绍,该显示屏具有1024*768的高分辨率,8位LVDS接口,外观尺寸为
[手机便携]
纳芯微携最新汽车和工业半导体方案亮相IIC 2022
上海2022年8月16日/ -- 今日, 纳芯微电子(以下简称“纳芯微”,)携公司高性能高可靠性模拟及混合信号芯片产品组合参加2022国际集成电路展览会暨研讨会(IIC)。 IIC 2022以“创新求变、坚定向前”为主题,于8月16-17日在南京国际博览中心2号馆举行。纳芯微为业界带来最新的技术干货和全面的汽车电子、工业和消费电子的应用解决方案。 纳芯微亮相2022国际集成电路展览会暨研讨会 “双碳”目标驱动,助力汽车电动化与智能化发展 应对全球气候变化挑战,在碳减排和提高能源效率的目标驱动下,可再生能源、新能源技术的应用在汽车和工业等领域得到快速发展。汽车方面,根据市场调研数据,2022年,我国汽车产销量预计达
[工业控制]
纳芯微携最新汽车和工业半导体方案亮相<font color='red'>IIC</font> 2022
单片机学习——IIC总线及EEPROM实验之二
题目:显示000~999跑表,先读数据到EEPROM,再从EEPROM读出,再在数码管上显示出 来 解决方案 :(C 语言编程) #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code tabledu ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90}; uchar code tablewe ={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u
[单片机]
按平台模式设计的虚拟I2C总线软件包VIIC
摘要:VIIC是主方式下的虚拟I2C总线软件包,用于80C51系列单片机的单主系统中。只需两根普通I/O口线就可随时扩展I2C总线外围器件。将VIIC1.0装入程序存储器中,对其中的符号单元赋值后,使用三条通用操作命令就可实现任何I2C总线外围器件的应用程序设计。本文以VIIC为例,介绍应用软件形式的广义平台设计方法,给出VIIC1.0程序文本。按照这一思路,也可移植到其他系列的嵌入式系统中。 关键词:平台模式虚拟I2C总线VIIC应用程序设计 一、I2C总线及其虚拟应用 1. I2C总线应用呼唤平台模式 目前,单片机应用系统的外围扩展已从并行方式为主过渡到以串行方式为主的时代。许多新型外围器件都带有串行扩展接口。通常的串
[传感技术]
赛灵思联合安富利重拳出击IIC-China 2007
事件: 赛灵思将与安富利携手展示最新的性价比高、灵活性强的可编程逻辑解决方案,以促进数字消费和视频处理设计的发展 地点: 深圳会展中心2号厅一层,展台号:2D29 时间: 2007年3月5-6日,每日上午9:30-下午5:00 2007年,深圳 - 赛灵思公司 (Xilinx, Inc.) (NASDAQ:XLNX) 和安富利公司电子元件部(Avnet Electronics Marketing) 日前宣布,他们将在2007年3月5-6日在深圳举行的中国国际集成电路研讨会暨展览 (IIC-China 2007) 上联合演示最新的高性价比、灵活性强的可编程逻辑解决方案,以促进数字消费和视频处理
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved