打印
[技术问答]

新唐MINI51的I2C从设备问题

[复制链接]
4924|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 測試。

使用特权

评论回复
5
niuyaliang| | 2014-4-18 07:54 | 只看该作者
先测试例程看你的硬件,重点怀疑硬件和时钟配置

使用特权

评论回复
6
harryhehui|  楼主 | 2014-4-18 11:58 | 只看该作者
已经解决,还是多谢你们的支持,呵呵

使用特权

评论回复
7
harryhehui|  楼主 | 2014-4-18 11:59 | 只看该作者
有个问题,这个IC写C代码可以定义位变量吗?如果可以,怎么定义?

使用特权

评论回复
8
598330983| | 2015-2-28 09:55 | 只看该作者
通信的时序很重要

使用特权

评论回复
9
kkkkkai| | 2015-5-15 15:34 | 只看该作者
我也遇到这样的事,郁闷中,想办法

使用特权

评论回复
10
mintspring| | 2015-5-16 18:10 | 只看该作者
人家设置一个多没意思啊,四个才能体现出是例程,然后你可以添加也可以减少。

使用特权

评论回复
11
643757107| | 2015-6-17 19:44 | 只看该作者
  I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
设置控制寄存器,IIC,SI,AA???三个参数嘛意思?

使用特权

评论回复
12
dqqqqqqqq| | 2018-12-13 16:40 | 只看该作者
遇到了同样的问题,请问您是怎么解决的呢

使用特权

评论回复
13
harryhehui|  楼主 | 2021-11-30 11:51 | 只看该作者
dqqqqqqqq 发表于 2018-12-13 16:40
遇到了同样的问题,请问您是怎么解决的呢

从设备不许要设置时钟,只需要写入从设备地址即可

使用特权

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

本版积分规则

2

主题

15

帖子

0

粉丝