[技术问答] 关于N76E003的IIC通信问题

[复制链接]
1845|6
 楼主| 落叶行健ywm 发表于 2020-1-6 21:34 | 显示全部楼层 |阅读模式
问题:现在想用N76E003当做IIC从机接受乐高EV3(主机)发送来的IIC数据。用示波器看到iic总线数据是正常的,尤其是地址位!如下图 IMG_20191219_090617.jpg
主机是每隔3s发送一次数据的。

然后从机使用的是官方V1.06版本里的从机代码,加入了一个中断标志位(UINT8 recvFlag=0;)作为进入中断的查看,但是我发现配置好之后程序一直没有进入过中断?哪位大神有调试成功的IIC从机程序可以借来参考下,谢谢!邮箱:490054348@qq.com

  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : May/1/2015
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 I2C Slave demo code
  14. //***********************************************************************************************************

  15. #include "N76E003.h"
  16. #include "Common.h"
  17. #include "Delay.h"
  18. #include "SFR_Macro.h"
  19. #include "Function_define.h"

  20. //***********************************************************************************************************
  21. //  N76E885-series I2C slave mode demo code, the Slave address = 0xA4
  22. //
  23. //   ____________            _____________
  24. //  |            |   SDA    |             |
  25. //  |            |<-------->|             |
  26. //  |            |          |             |
  27. //  |N76E003(M) |          | N76E003(S) |
  28. //  |(I2C_Master)|          | (I2C_Slave) |
  29. //  |            |   SCL    |             |
  30. //  |            |--------->|             |
  31. //  |____________|          |_____________|
  32. //
  33. //  The protocol of I2C is same the "24LC64"
  34. //***********************************************************************************************************


  35. #define I2C_CLOCK               13
  36. #define EEPROM_SLA              0x02


  37. UINT8 data_received[34], data_num = 0;
  38. UINT8 recvFlag=0;


  39. void Init_I2C(void);

  40. void Bsp_delay10us(void)
  41. {
  42.         UINT8 i=0;
  43.         for(i=0;i<18;i++)
  44.         {
  45.                 _nop_();
  46.         }
  47. }

  48. void Bsp_delayms(int ms)
  49. {
  50.         int i=0,j=0;
  51.         for(i=0;i<ms;i++)
  52.         {
  53.                 for(j=0;j<100;j++)
  54.                 {
  55.                         Bsp_delay10us();
  56.                 }
  57.         }
  58. }




  59. //========================================================================================================
  60. void I2C_ISR(void) interrupt 6
  61. {
  62.        
  63.         recvFlag=1;
  64.        
  65.     switch (I2STAT)
  66.     {
  67.         case 0x00:
  68.             STO = 1;
  69.             break;

  70.         case 0x60:
  71.             AA = 1;
  72.             //P3 = 0x60;
  73.             break;
  74.                                
  75.         case 0x68:
  76.                         P02 = 0;
  77.             while(1);
  78.             break;

  79.         case 0x80:
  80.             //P3 = 0x80;
  81.             data_received[data_num] = I2DAT;
  82.             data_num++;

  83.             if (data_num == 34)
  84.                 AA = 0;
  85.             else
  86.                 AA = 1;
  87.             break;

  88.         case 0x88:
  89.             //P3 = 0x88;
  90.             data_received[data_num] = I2DAT;
  91.             data_num = 0;
  92.             AA = 1;
  93.             break;

  94.         case 0xA0:
  95.             //P3 = 0xA0;
  96.             AA = 1;
  97.             break;

  98.         case 0xA8:
  99.             //P3 = 0xA0;
  100.             I2DAT = data_received[data_num];
  101.             data_num++;
  102.             AA = 1;
  103.             break;
  104.         
  105.         case 0xB8:
  106.             //P3 = 0xB8;
  107.             I2DAT = data_received[data_num];
  108.             data_num++;
  109.             AA = 1;
  110.             break;

  111.         case 0xC0:
  112.             AA = 1;
  113.             break;

  114.         case 0xC8:
  115.             //P3 = 0xC8;
  116.             AA = 1;
  117.             break;  
  118.                
  119.                 //ywm
  120.                 default:
  121.                         Init_I2C();
  122.                         break;
  123.     }

  124.     SI = 0;
  125.         clr_I2TOF;
  126. }

  127. //========================================================================================================
  128. void Init_I2C(void)
  129. {
  130.     P13_Quasi_Mode;                         //set SCL (P13) is Quasi mode
  131.     P14_Quasi_Mode;                         //set SDA (P14) is Quasi mode
  132.    
  133.     SDA = 1;                                //set SDA and SCL pins high
  134.     SCL = 1;
  135.    
  136.     //set_P0SR_6;                             //set SCL (P06) is  Schmitt triggered input select.
  137.     set_P1SR_3;

  138.     set_EI2C;                               //enable I2C interrupt by setting IE1 bit 0
  139.     set_EA;

  140.        
  141.         // I2c¶¨Ê±Æ÷
  142.         //set_I2TOCEN;
  143.         //set_DIV;
  144.         //clr_DIV;
  145.         //clr_I2TOF;


  146.     I2ADDR = EEPROM_SLA;                    //define own slave address
  147.     set_I2CEN;                              //enable I2C circuit
  148.     set_AA;
  149. }



  150. //========================================================================================================
  151. void main(void)
  152. {
  153.         UINT8 i=0;
  154.     Set_All_GPIO_Quasi_Mode;
  155.    
  156.     /* Initial I2C function */
  157.     Init_I2C();                                 //initial I2C circuit

  158.        
  159.         for(i=0;i<3;i++)
  160.         {
  161.                 clr_GPIO1;// Tiny board GPIO1 LED define
  162.                 set_GPIOFMQ;
  163.                 Bsp_delayms(100);
  164.                 set_GPIO1;
  165.                 clr_GPIOFMQ;               
  166.                 Bsp_delayms(100);
  167.         }

  168.        
  169.        
  170.     while (1)
  171.         {
  172. if(recvFlag == 1)
  173.                 {
  174.                         set_GPIOFMQ;// Tiny board GPIO1 LED define
  175.                         Bsp_delayms(1000);
  176.                         clr_GPIOFMQ;       
  177.                         Bsp_delayms(1000);
  178.                         recvFlag=0;
  179.                 }
  180.                
  181.                
  182.                 clr_GPIO1;// Tiny board GPIO1 LED define
  183.                 Bsp_delayms(100);
  184.                 set_GPIO1;       
  185.                 Bsp_delayms(100);

  186.        
  187.         }
  188. /* =================== */
  189. }


捉虫天师 发表于 2020-1-6 22:58 | 显示全部楼层
你先跑官方源程序,看看能否收到消息。
捉虫天师 发表于 2020-1-6 23:00 | 显示全部楼层
反正要一步一步调试问题。
jasontu 发表于 2020-1-7 07:51 | 显示全部楼层
slave的位址設錯了。
應該是0x4e
 楼主| 落叶行健ywm 发表于 2020-1-7 18:26 | 显示全部楼层
捉虫天师 发表于 2020-1-6 23:00
反正要一步一步调试问题。

累人,好久不开发了,生疏了
 楼主| 落叶行健ywm 发表于 2020-1-7 18:27 | 显示全部楼层
jasontu 发表于 2020-1-7 07:51
slave的位址設錯了。
應該是0x4e

上面那个地址是之前的,后面都改为01了。拍的照片只是证明主机没问题
yiy 发表于 2020-1-7 23:58 | 显示全部楼层
示波器都可以捕获到波形了,用IO模拟试试看,应该没问题吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:爱这个世界!

34

主题

715

帖子

18

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