打印

[范例教程] 笙泉【8051 1T】MA82G5D16 IIC

[复制链接]
446|6
跳转到指定楼层
楼主
 楼主 | 2018-12-28 16:29 | 只看该作者 |退出气泡模式 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 KobeLai 于 2019-1-22 16:55 编辑

MA82G5D16 IIC操作步骤(初始化)
一:选择IIC接口的端口(本范例选择P22为SCL,P24为SDA)。
二:主机模式下需要选择IIC的时钟(不能超过1MHz),从机模式会自动同步主机时钟(最高400KHz)。

void TWI0_Init()
{
        SICON=0x00;
        //P22,P24 is Open drain with pull high
        P2M0=P2M0|(P2M02|P2M04);
        SFRPI=1;
        P2M1=P2M1|(P2M12|P2M14);
        P2M1&=~P2M12;
        SFRPI=0;
        _nop_();
        _nop_();
        _nop_();
        AUXR3 = 0x06;                              //sel P22/P24 as SCL/SDA         
        SICON = ( CR2 | ENSI | CR1 | CR0 );                //enable TWSI and clock source Timer0 overflow, I2C Freq is 400KHz.
}

void Timer0_Initial(void)
{
        TMOD = 0x02;
        TH0 = 251;
        TL0 = 251;
        TR0 = 1;
        AUXR2 = T0X12;

}

MA82G5D16支持笙泉的OCD ICE,可以在Keil 3,Keil 4,Keil 5环境下自由仿真。
下面网址可以下载仿真安装包:
http://www.megawin.com.tw/zh-cn/support/index/70/113

沙发
 楼主 | 2018-12-28 16:35 | 只看该作者
本帖最后由 KobeLai 于 2018-12-28 16:37 编辑

MA82G5D16 IIC读取

  1. uCHAR tmp;
  2. uCHAR TWI0_Err;

  3. uCHAR I2C_Read(uCHAR Dev_Addr, uCHAR Reg_Addr)
  4. {        
  5.         uCHAR        usData = 0;
  6.         uINT         cnt = 0;

  7.         SICON |= STA;
  8.         SICON &= ~SI;
  9.         cnt = 0;
  10.         while( (SICON&SI) != SI)
  11.         {
  12.                 cnt++;
  13.                 if(cnt > _TWSI_TIME_MAX_)
  14.                 {        
  15.                         TWI0_Err = 1;
  16.                         goto TWI0R_End;
  17.                 }
  18.         }
  19.         SICON &= ~STA;

  20.         SIDAT = Dev_Addr;                                                        // send device address
  21.         SICON &= ~SI;
  22.         cnt = 0;
  23.         while( (SICON&SI) != SI)
  24.         {
  25.                 cnt++;
  26.                 if(cnt > _TWSI_TIME_MAX_)
  27.                 {        
  28.                         TWI0_Err = 1;
  29.                         goto TWI0R_End;
  30.                 }
  31.         }

  32.         SIDAT = Reg_Addr;                                                        // send register address
  33.         SICON &= ~SI;
  34.         cnt = 0;
  35.         while( (SICON&SI) != SI)
  36.         {
  37.                 cnt++;
  38.                 if(cnt > _TWSI_TIME_MAX_)
  39.                 {        
  40.                         TWI0_Err = 1;
  41.                         goto TWI0R_End;
  42.                 }
  43.         }


  44.         SICON |= STA;                                                                // restart
  45.         SICON &= ~SI;
  46.         cnt = 0;
  47.         while( (SICON&SI) != SI)
  48.         {
  49.                 cnt++;
  50.                 if(cnt > _TWSI_TIME_MAX_)
  51.                 {        
  52.                         TWI0_Err = 1;
  53.                         goto TWI0R_End;
  54.                 }
  55.         }
  56.         SICON &= ~STA;

  57.         SIDAT = Dev_Addr | 0x01;                                        // send device address
  58.         SICON &= ~SI;
  59.         cnt = 0;
  60.         while( (SICON&SI) != SI)
  61.         {
  62.                 cnt++;
  63.                 if(cnt > _TWSI_TIME_MAX_)
  64.                 {        
  65.                         TWI0_Err = 1;
  66.                         goto TWI0R_End;
  67.                 }
  68.         }

  69.         SICON &= ~SI;
  70.         cnt = 0;
  71.         while( (SICON&SI) != SI)
  72.         {
  73.                 cnt++;
  74.                 if(cnt > _TWSI_TIME_MAX_)
  75.                 {        
  76.                         TWI0_Err = 1;
  77.                         goto TWI0R_End;
  78.                 }
  79.         }
  80.         usData = SIDAT;

  81.         SICON |= STO;
  82.         SICON &= ~SI;
  83.         cnt = 0;
  84.         while((SICON&STO) == STO)
  85.         {        
  86.                 cnt++;
  87.                 if(cnt > _TWSI_TIME_MAX_)
  88.                 {        
  89.                         TWI0_Err = 1;
  90.                         goto TWI0R_End;
  91.                 }
  92.         }
  93. TWI0R_End:
  94.         return usData;
  95. }
复制代码
板凳
 楼主 | 2018-12-28 16:37 | 只看该作者
MA82G5D16 IIC 写入

  1. void I2C_Write(uCHAR Dev_Addr, uCHAR Reg_Addr, uCHAR ucData)
  2. {
  3.         uINT         cnt = 0;
  4.         SICON |= STA;
  5.         SICON &= ~SI;
  6.         cnt = 0;
  7.         while( (SICON&SI) != SI)
  8.         {
  9.                 cnt++;
  10.                 if(cnt > _TWSI_TIME_MAX_)
  11.                 {       
  12.                         TWI0_Err = 1;
  13.                         goto TWI0W_End;
  14.                 }
  15.         }
  16.         SICON &= ~STA;

  17.         SIDAT = Dev_Addr;                                                        // send device address
  18.         SICON &= ~SI;
  19.         cnt = 0;
  20.         while( (SICON&SI) != SI)
  21.         {
  22.                 cnt++;
  23.                 if(cnt > _TWSI_TIME_MAX_)
  24.                 {       
  25.                         TWI0_Err = 1;
  26.                         goto TWI0W_End;
  27.                 }
  28.         }

  29.         SIDAT = Reg_Addr;                                                        // send register address
  30.         SICON &= ~SI;
  31.         cnt = 0;
  32.         while( (SICON&SI) != SI)
  33.         {
  34.                 cnt++;
  35.                 if(cnt > _TWSI_TIME_MAX_)
  36.                 {       
  37.                         TWI0_Err = 1;
  38.                         goto TWI0W_End;
  39.                 }
  40.         }

  41.         SIDAT = ucData;                                                                // send data
  42.         SICON &= ~SI;
  43.         cnt = 0;
  44.         while( (SICON&SI) != SI)
  45.         {
  46.                 cnt++;
  47.                 if(cnt > _TWSI_TIME_MAX_)
  48.                 {       
  49.                         TWI0_Err = 1;
  50.                         goto TWI0W_End;
  51.                 }
  52.         }

  53.     SICON |= STO;
  54.     SICON &= ~SI;
  55.         cnt = 0;
  56.         while( (SICON&STO) != STO)
  57.         {
  58.                 cnt++;
  59.                 if(cnt > _TWSI_TIME_MAX_)
  60.                 {       
  61.                         TWI0_Err = 1;
  62.                         goto TWI0W_End;
  63.                 }
  64.         }
  65. TWI0W_End:
  66.         _nop_();
  67. }
复制代码
地板
| 2019-1-3 11:01 | 只看该作者
请问下,我用了P45 P44 赖做SDA SCL  一直无法通讯成功
5
 楼主 | 2019-1-3 15:24 | 只看该作者
本帖最后由 KobeLai 于 2019-1-3 15:29 编辑


P44,P45是仿真器的接口,不是IIC的接口哟!
IIC的接口如下



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6
| 2019-1-10 11:36 | 只看该作者
KobeLai 发表于 2019-1-3 15:24
P44,P45是仿真器的接口,不是IIC的接口哟!
IIC的接口如下

你说的自带的硬件IIC  P44 P45 可以禁止OCD,做普通IO  然后用作模拟IIC的SDA   SCL  这样应该可以行吧
7
 楼主 | 2019-1-11 16:21 | 只看该作者
样样 发表于 2019-1-10 11:36
你说的自带的硬件IIC  P44 P45 可以禁止OCD,做普通IO  然后用作模拟IIC的SDA   SCL  这样应该可以行吧 ...

P44,P45不能作为用户的IIC
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表