打印
[Cortex-M0技术交流]

新塘的NUC120的I2C中断出问题了,求解决

[复制链接]
3708|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oyljxilige|  楼主 | 2012-4-13 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的nuc120的I2C作为从机只能发送和接收一个正确的数据,大于一个数据接受到主机的数据就不正确,主机用的是模拟的I2C,从机用的是自带的I2C,我用串口打印出主机信息,显示是主机在发送完第二个数据后没收到从机的应答 ,我看新塘的数据手册上有这样一段话file:///D:/QQ/Users/350744253/Image/pgkc6kavg0y%7Ddod2%7B%25tfdks.jpg
是不是他发送或接受到一个数据之后就不会发送AA应答了 ,
下面是我的I2C初始化和中断程序
void I2C_init(void)
{
   /* Set I2C I/O */
    DrvGPIO_InitFunction(E_FUNC_I2C0);
DrvI2C_Open(I2C_PORT0, 400000);
    DrvI2C_SetAddress( I2C_PORT0,0,Device_Addr>>1,0 );                                            
    // 设置I2C 地址1,并将广播命令关闭(高七位为地址,最低一位为读写位)
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 0, 1);
    //设置为从机模式
   
    DrvI2C_EnableInt(I2C_PORT0);
    // 使能I2C_PORT
   
    DrvI2C_InstallCallback(I2C_PORT0, I2CFUNC, I2C0_Callback_Slave);
    //使能中断      
}


void I2C0_Callback_Slave(uint32_t status)
{
//    Power_Off();
    if ((status == 0x60) || (status == 0x68))       /* SLA+W has been received and ACK has been returned */
    {//从机接收模式
        DataLen1 = 0;
        DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);     //产生应答,清中断SI
    }   
    else if (status == 0x80)                        /* DATA has been received and ACK has been returned */
    {
        Addr1[DataLen1++] = DrvI2C_ReadData(I2C_PORT0);
        
        if (DataLen1 == 2)
        {
       aaa = 0;
//    DataLen1=2;
        }
        if ((DataLen1 == 5))
        {     
       aaa = 1;
          DataLen1 = 0;   
      
        }
//   if(DataLen1==1||DataLen1==2)
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);
//  else
//  DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
    }   
    else if ((status == 0xB0) || (status == 0xA8))  /* SLA+R has been received and ACK has been returned */
    { //从机传输模式
        DrvI2C_WriteData(I2C_PORT0, Addr2[DataLen2++]);
  if(DataLen2>=3)DataLen2=0;
        DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
    }
    else if (status == 0xC0)                        /* DATA has been transmitted and NACK has been received */
    {
        DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
    }
    else if (status == 0xA0)                        /* STOP or Repeat START has been received */
    {
        DataLen1 = 0;
        DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
    }
    else
    {
        printf("Status 0x%x is NOT processed\n", status);
    }
}

相关帖子

沙发
oyljxilige|  楼主 | 2012-4-28 15:10 | 只看该作者
经过今天上午一上午仔细检查,问题终于解决了,我用的是PORT0,在中断收到数据时竟写成DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);太粗心了,改为DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);就ok了
我主机用的是中星微的816芯片模拟I2C,从机是nuc120,修改后经我验证,以上程序作为从机是完全可以收发数据

使用特权

评论回复
板凳
296895536| | 2013-3-21 16:43 | 只看该作者
顶个。 求个源码~:)

使用特权

评论回复
地板
缥缈九哥| | 2013-3-22 20:20 | 只看该作者
新唐的BSP包源码。我用过很多例子,没有发现有任何问题。

使用特权

评论回复
5
lqc754| | 2014-9-25 15:23 | 只看该作者
学习!

使用特权

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

本版积分规则

0

主题

19

帖子

1

粉丝