[技术问答] 新唐MINI51的I2C从设备问题

[复制链接]
5458|12
 楼主| harryhehui 发表于 2014-4-16 17:27 | 显示全部楼层 |阅读模式
我现在用MIN51做I2C的从设备,用中断来读主设备数据,参考了官网里面有个例程(I2C_Software_GPIO),但是原程序里面里面设了四个设备地址,我的设备地址是0xa0,要怎么设置啊?

     /* Set I2C 4 Slave Addresses */            
    I2C_SetSlaveAddr(I2C, 0, 0x15, 0);   /* Slave Address : 0x15 */
    I2C_SetSlaveAddr(I2C, 1, 0x35, 0);   /* Slave Address : 0x35 */
    I2C_SetSlaveAddr(I2C, 2, 0x55, 0);   /* Slave Address : 0x55 */
    I2C_SetSlaveAddr(I2C, 3, 0x75, 0);   /* Slave Address : 0x75 */

请问为什么要设四个从设备地址啊?还有作为从设备难道也要设置时钟吗?
     /* Open I2C module and set bus clock */
    I2C_Open(I2C, 120);

我现在怎么设置都进不了中断,各路高手请指点一下,急盼大侠回复。


下面是中断程序(例程没有改动):
void I2C_IRQHandler(void)
{
    uint32_t u32Status;

    u32Status = I2C_GET_STATUS(I2C);

    switch(u32Status)
    {
        /* Slave Transmitter Mode */
        case 0xC0:                        /* DATA has been transmitted and NACK has been returned */
        case 0xC8:                        /* DATA has been transmitted and ACK has been returned */
            I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            printf("Slave Transmitter Success\n");            
            break;

        case 0xA8:                        /* SLA+R has been received and ACK has been returned */  
        case 0xB0:
            DataLen = 0;
        case 0xB8:                        /* DATA has been transmitted and ACK has been returned */
            I2C_SET_DATA(I2C, Tx_Data[DataLen++]);
            if(DataLen<sizeof(Tx_Data))   
                I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            else
                I2C_SET_CONTROL_REG(I2C, I2C_SI);
            break;

        /* Slave Receiver Mode*/
        case 0x68:                        /* SLA+W has been received and ACK has been returned */
        case 0x60:
            DataLen = 0;
            Rx_Data[0] = 0;
            I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            break;
        case 0x80:                        /* DATA has been received and ACK has been returned */
            Rx_Data[DataLen++] = I2C_GET_DATA(I2C);
            if(DataLen<(sizeof(Rx_Data)-1))
                I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            else
                I2C_SET_CONTROL_REG(I2C, I2C_SI);
            break;
        case 0x88:                        /* DATA has been received and NACK has been returned */
            Rx_Data[DataLen++] = I2C_GET_DATA(I2C);
            I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            break;

        case 0xA0:                      /* STOP or Repeat START has been received */
            I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
            printf("Slave Receiver Success\n");
            break;        
    }
}




 楼主| harryhehui 发表于 2014-4-16 17:28 | 显示全部楼层
没人理吗?
 楼主| harryhehui 发表于 2014-4-17 10:19 | 显示全部楼层
我就是从你们公司拿的IC啊,可惜发了邮件没有回复
a_ziliu 发表于 2014-4-17 16:01 | 显示全部楼层
先檢查電路,i2c外面是不是有掛pull 電阻。
i2c 當slave 是不用設時鐘的,但cpu速度要設成i2c clock的4倍。
位址只要設一個即可,設多個只是要當多位址接收用。

你可以跑裡面的master 跟slave sample code 測試。
niuyaliang 发表于 2014-4-18 07:54 来自手机 | 显示全部楼层
先测试例程看你的硬件,重点怀疑硬件和时钟配置
 楼主| harryhehui 发表于 2014-4-18 11:58 | 显示全部楼层
已经解决,还是多谢你们的支持,呵呵
 楼主| harryhehui 发表于 2014-4-18 11:59 | 显示全部楼层
有个问题,这个IC写C代码可以定义位变量吗?如果可以,怎么定义?
598330983 发表于 2015-2-28 09:55 来自手机 | 显示全部楼层
通信的时序很重要
kkkkkai 发表于 2015-5-15 15:34 | 显示全部楼层
我也遇到这样的事,郁闷中,想办法
mintspring 发表于 2015-5-16 18:10 | 显示全部楼层
人家设置一个多没意思啊,四个才能体现出是例程,然后你可以添加也可以减少。
643757107 发表于 2015-6-17 19:44 | 显示全部楼层
  I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
设置控制寄存器,IIC,SI,AA???三个参数嘛意思?
dqqqqqqqq 发表于 2018-12-13 16:40 | 显示全部楼层
遇到了同样的问题,请问您是怎么解决的呢
 楼主| harryhehui 发表于 2021-11-30 11:51 | 显示全部楼层
dqqqqqqqq 发表于 2018-12-13 16:40
遇到了同样的问题,请问您是怎么解决的呢

从设备不许要设置时钟,只需要写入从设备地址即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部