[范例教程]

笙泉【8051 1T】MA82G5D16 IIC

[复制链接]
1753|6
手机看帖
扫描二维码
随时随地手机跟帖
KobeLai|  楼主 | 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

KobeLai|  楼主 | 2018-12-28 16:35 | 显示全部楼层
本帖最后由 KobeLai 于 2018-12-28 16:37 编辑

MA82G5D16 IIC读取

uCHAR tmp;
uCHAR TWI0_Err;

uCHAR I2C_Read(uCHAR Dev_Addr, uCHAR Reg_Addr)
{        
        uCHAR        usData = 0;
        uINT         cnt = 0;

        SICON |= STA;
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }
        SICON &= ~STA;

        SIDAT = Dev_Addr;                                                        // send device address
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }

        SIDAT = Reg_Addr;                                                        // send register address
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }


        SICON |= STA;                                                                // restart
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }
        SICON &= ~STA;

        SIDAT = Dev_Addr | 0x01;                                        // send device address
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }

        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }
        usData = SIDAT;

        SICON |= STO;
        SICON &= ~SI;
        cnt = 0;
        while((SICON&STO) == STO)
        {        
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {        
                        TWI0_Err = 1;
                        goto TWI0R_End;
                }
        }
TWI0R_End:
        return usData;
}

使用特权

评论回复
KobeLai|  楼主 | 2018-12-28 16:37 | 显示全部楼层
MA82G5D16 IIC 写入

void I2C_Write(uCHAR Dev_Addr, uCHAR Reg_Addr, uCHAR ucData)
{
        uINT         cnt = 0;
        SICON |= STA;
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {       
                        TWI0_Err = 1;
                        goto TWI0W_End;
                }
        }
        SICON &= ~STA;

        SIDAT = Dev_Addr;                                                        // send device address
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {       
                        TWI0_Err = 1;
                        goto TWI0W_End;
                }
        }

        SIDAT = Reg_Addr;                                                        // send register address
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {       
                        TWI0_Err = 1;
                        goto TWI0W_End;
                }
        }

        SIDAT = ucData;                                                                // send data
        SICON &= ~SI;
        cnt = 0;
        while( (SICON&SI) != SI)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {       
                        TWI0_Err = 1;
                        goto TWI0W_End;
                }
        }

    SICON |= STO;
    SICON &= ~SI;
        cnt = 0;
        while( (SICON&STO) != STO)
        {
                cnt++;
                if(cnt > _TWSI_TIME_MAX_)
                {       
                        TWI0_Err = 1;
                        goto TWI0W_End;
                }
        }
TWI0W_End:
        _nop_();
}

使用特权

评论回复
样样| | 2019-1-3 11:01 | 显示全部楼层
请问下,我用了P45 P44 赖做SDA SCL  一直无法通讯成功

使用特权

评论回复
KobeLai|  楼主 | 2019-1-3 15:24 | 显示全部楼层
本帖最后由 KobeLai 于 2019-1-3 15:29 编辑


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



Catch.jpg

使用特权

评论回复
样样| | 2019-1-10 11:36 | 显示全部楼层
KobeLai 发表于 2019-1-3 15:24
P44,P45是仿真器的接口,不是IIC的接口哟!
IIC的接口如下

你说的自带的硬件IIC  P44 P45 可以禁止OCD,做普通IO  然后用作模拟IIC的SDA   SCL  这样应该可以行吧

使用特权

评论回复
KobeLai|  楼主 | 2019-1-11 16:21 | 显示全部楼层
样样 发表于 2019-1-10 11:36
你说的自带的硬件IIC  P44 P45 可以禁止OCD,做普通IO  然后用作模拟IIC的SDA   SCL  这样应该可以行吧 ...

P44,P45不能作为用户的IIC

使用特权

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

本版积分规则

4

主题

14

帖子

1

粉丝