打印
[DemoCode下载]

ML51的I2C操作

[复制链接]
1105|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2019-8-31 00:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, TE, se, ce
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//***********************************************************************************************************

#include "ML51.h"

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]        I2C0 master demo.
* @param       None
* [url=home.php?mod=space&uid=266161]@return[/url]      None
* [url=home.php?mod=space&uid=1543424]@Details[/url]     please confirm enable LXT and check work stable if use LXT as WKT clock source.
*/


unsigned char u8DeviceAddr;

bit I2CEndFlag=0,I2CErrorFlag=0;
unsigned char u8DataLen;
unsigned char xdata u8TxData[10],u8MstRxData[10];

void I2C0_ISR(void) interrupt 6           // Vector [url=home.php?mod=space&uid=72445]@[/url]  0x33
{
    switch(I2C0STAT)
    {
/* START has been transmitted, send read or write status to the bus */
      case 0x08:                    
          clr_I2C0CON_STA;         
          I2C0DAT = (u8DeviceAddr<<1)|I2C_R;             /* Write SLA+R to Register I2C0DAT */
      break;
/* For master RX status */
/* SLA+R has been transmitted and ACK has been received */
      case 0x40:                                      
          u8MstRxData[u8DataLen] = I2C0DAT;
          set_I2C0CON_AA;
      break;
/* SLA+R has been transmitted and NACK has been received */
      case 0x48:                                      
          set_I2C0CON_STO;                             /* This status should not be found, send stop to close this transmit.*/
          I2CEndFlag = 1;
          I2CErrorFlag = 1;
      break;      
/* Data has been recived and ACK has been received */      
      case 0x50:                                      
          u8MstRxData[u8DataLen++] = I2C0DAT;
          set_I2C0CON_AA;                               /* send ACK to slave */
      case 0x58:
          u8MstRxData[u8DataLen++] = I2C0DAT;
          clr_I2C0CON_AA;
          set_I2C0CON_STO;
          I2CEndFlag = 1;
          I2CErrorFlag = 0;
      break;
/* Bus error */
      case 0x00:
          set_I2C0CON_STO;
          I2CEndFlag = 1;
          I2CErrorFlag = 1;
      break;
}
      clr_I2C0CON_SI;
}

/*---------------------------------------------------------------------------------------------------------*/
/*  I2C Tx Callback Function                                                                               */
/*---------------------------------------------------------------------------------------------------------*/
void I2C_INIT(void)
{
    I2C_Open(I2C0, 24000000, 100000);
    I2C_EnableTimeout(I2C0);
    I2C_EnableInt(I2C0);
}

void main (void)
{
    MFP_P13_GPIO;
    P13_PUSHPULL_MODE;

    MFP_P24_I2C0_SDA;
    P24_OPENDRAIN_MODE;
    MFP_P25_I2C0_SCL;
    P25_OPENDRAIN_MODE;
  
    I2C_Open(I2C0, 24000000, 100000);
    I2C_EnableTimeout(I2C0);
    I2C_EnableInt(I2C0);
  
    while(I2CEndFlag==0);
    if(I2CErrorFlag|I2C0STAT==0xF8)
    {
        I2CEndFlag = 0;
        I2CErrorFlag = 0;
        while(I2CEndFlag==0);
    }   
  
  while(1);
  
}



使用特权

评论回复
沙发
dongnanxibei|  楼主 | 2019-8-31 00:38 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//***********************************************************************************************************

#include "ML51.h"

/**
* @brief        I2C0 master demo.
* @param       None
* @return      None
* @details     please confirm enable LXT and check work stable if use LXT as WKT clock source.
*/


unsigned char u8DeviceAddr;

bit I2CEndFlag=0,I2CErrorFlag=0;
unsigned char u8DataLen;
unsigned char xdata u8TxData[10],u8MstRxData[10];

void I2C0_ISR(void) interrupt 6           // Vector @  0x33
{
    switch(I2C0STAT)
    {
/* START has been transmitted, send read or write status to the bus */
      case 0x08:                    
          clr_I2C0CON_STA;         
          I2C0DAT = (u8DeviceAddr<<1)|I2C_W;             /* Write SLA+W to Register I2C0DAT */
      break;
/* For master TX status */
/* SLA+W has been transmitted and ACK has been received */
      case 0x18:                    
          I2C0DAT = u8TxData[u8DataLen++];             /* Write data to Register I2C0DAT */         
      break;
/* SLA+W has been transmitted and NACK has been received */
      case 0x20:                                       
          set_I2C0CON_STO;                             /* This status should not be found, send stop to close this transmit.*/
          I2CEndFlag = 1;
      break;
/* Data has been transmitted and ACK has been received */
      case 0x28:
          if(u8DataLen != 10)
          {
              I2C0DAT = u8TxData[u8DataLen++];   
              clr_I2C0CON_SI;
          }
          else
          {
              set_I2C0CON_STO;                         /* Send stop*/
              I2CEndFlag = 1;
              I2CErrorFlag = 0;
          }
      break;
/* Data has been transmitted and ACK has been received */
      case 0x30:
          set_I2C0CON_STO;
      break;
      case 0x00:
          set_I2C0CON_STO;
          I2CErrorFlag = 1;
    }
      clr_I2C0TOC_I2TOF;
      clr_I2C0CON_SI;
}

void Databuffer(void)
{
  unsigned char i;
  
  for(i=0;i<10;i++)
  {
    u8TxData[i]=i;
  }
}


void main (void)
{
    MFP_P13_GPIO;
    P13_PUSHPULL_MODE;

    MFP_P24_I2C0_SDA;
    P24_OPENDRAIN_MODE;
    MFP_P25_I2C0_SCL;
    P25_OPENDRAIN_MODE;
   
    Databuffer();
  
    I2C_Open(I2C0, 24000000, 100000);
    I2C_EnableTimeout(I2C0);
    I2C_EnableInt(I2C0);
    ENABLE_GLOBAL_INTERRUPT;
    I2CEndFlag = 0;
    I2CErrorFlag = 0;
  
    set_I2C0CON_STA;
    while(I2CEndFlag==0);
    if(I2CErrorFlag)
    {
          I2CErrorFlag = 0;
          I2CEndFlag = 0;
          I2C_Close(I2C0);
          I2C_Open(I2C0, 24000000, 100000);
          set_I2C0CON_STA;
          clr_I2C0TOC_I2TOF;
          while(I2CEndFlag==0);
    }
    else
    {
      I2C_DisableInt(I2C0);
      I2C_Close(I2C0);
    }
  
    while(1);
  
}



使用特权

评论回复
板凳
dongnanxibei|  楼主 | 2019-8-31 00:38 | 只看该作者
一个接收,一个发送,现在51都提供库函数了,真是方便。

使用特权

评论回复
地板
xuanhuanzi| | 2019-8-31 20:38 | 只看该作者
这个接口很全面。

使用特权

评论回复
5
xuanhuanzi| | 2019-8-31 20:39 | 只看该作者
新唐在51上做的贡献很大

使用特权

评论回复
6
yiyigirl2014| | 2019-8-31 21:54 | 只看该作者
仍然有一些宏。

使用特权

评论回复
7
mintspring| | 2019-9-9 00:08 | 只看该作者
有硬件收发器就不用讲具体什么协议了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

3489

帖子

16

粉丝