[技术问答] N76E003新唐mcu做从机模拟AT24C02程序

[复制链接]
1474|7
 楼主| ccook11 发表于 2024-2-29 16:23 | 显示全部楼层 |阅读模式
  1. #include "N76E003.h"
  2. #include "Common.h"
  3. #include "Delay.h"
  4. #include "SFR_Macro.h"
  5. #include "Function_define.h"


  6. #define EEPROM_SLA              0xA0   //AT24C02

  7. UINT8 data_received[64]= 0;    //change to 256 if the rom space is enough
  8. UINT8 data_num = 0;   

  9. UINT8 irxdata =0;
  10. UINT8 isubaddr =0;


  11. void I2C_ISR(void) interrupt 6
  12. {

  13.     static UINT8 islavecount=0;
  14.    
  15.     switch (I2STAT)
  16.     {
  17.         case 0x00:
  18.             STO = 1;
  19.         
  20.             break;

  21.         case 0x60:   
  22.             AA = 1;
  23.         
  24.             islavecount=0;
  25.         
  26.             break;
  27.                               
  28.         case 0x68:   
  29.                                 P02 = 0;
  30.         
  31.             while(1);
  32.             break;
  33.         
  34.         
  35.         case 0x80:   
  36.         
  37.             if(islavecount==0)
  38.             {
  39.                isubaddr = I2DAT;
  40.                AA = 1;
  41.                islavecount++;
  42.                
  43.                data_num = isubaddr;
  44.                
  45.             }
  46.             else  
  47.             {
  48.                irxdata = I2DAT;
  49.                AA = 1;  
  50.                
  51.                data_received[data_num++]=irxdata;
  52.                
  53.                islavecount++;               
  54.             }        
  55.         
  56.             break;      
  57.         

  58.         case 0x88:
  59.         
  60.             data_received[data_num] = I2DAT;
  61.             data_num = 0;
  62.             AA = 1;
  63.         
  64.             break;


  65.         case 0xA0:     
  66.             
  67.             AA = 1;
  68.             break;
  69.         
  70.         case 0xA8:     
  71.         
  72.             data_num=isubaddr;
  73.         
  74.             I2DAT = data_received[data_num];
  75.             data_num++;
  76.             AA = 1;
  77.         
  78.             break;        
  79.         
  80.         case 0xB8:   
  81.         
  82.             I2DAT = data_received[data_num];
  83.             data_num++;
  84.             AA = 1;
  85.         
  86.             break;

  87.         case 0xC0:      
  88.             AA = 1;
  89.             break;

  90.         case 0xC8:     
  91.         
  92.             AA = 1;

  93.             break;        
  94.     }

  95.     SI = 0;
  96.    
  97. }


  98. void Init_I2C_SLAVE(void)
  99. {
  100.     P13_Quasi_Mode;                         //set SCL (P13) is Quasi mode
  101.     P14_Quasi_Mode;                         //set SDA (P14) is Quasi mode
  102.    
  103.     SDA = 1;                                //set SDA and SCL pins high
  104.     SCL = 1;
  105.    
  106.     //--set_P0SR_6;                             //set SCL (P06) is  Schmitt triggered input select.
  107.    
  108.     set_EI2C;                               //enable I2C interrupt by setting IE1 bit 0
  109.     set_EA;

  110.     I2ADDR = EEPROM_SLA;                    //define own slave address
  111.     set_I2CEN;                              //enable I2C circuit
  112.     set_AA;
  113. }


  114. void main(void)
  115. {

  116.    Set_All_GPIO_Quasi_Mode;

  117.    Init_I2C_SLAVE();                                 

  118.    while (1);

  119. }


tpgf 发表于 2024-3-1 09:46 | 显示全部楼层
看楼主给的代码这个应该是使用的iic通讯方式吧  
八层楼 发表于 2024-3-1 10:25 | 显示全部楼层
感觉这么多的id在程序烧写的时候就是个大工程
guanjiaer 发表于 2024-3-1 22:20 | 显示全部楼层
楼主好像使用的是一种状态机的方式来运行的iic
观海 发表于 2024-3-1 22:51 | 显示全部楼层
选择语句的判据是哪里得到的呢 代码里边没有找到啊
晓伍 发表于 2024-3-1 23:22 | 显示全部楼层
iic一条总线可以带多个从设备  那么从设备的id可以动态变动吗
磨砂 发表于 2024-3-1 23:53 | 显示全部楼层
这个是调用的库函数还是自己模拟的呢 为什么这么多的分支呀
ClarkLLOTP 发表于 2024-3-5 15:39 来自手机 | 显示全部楼层
switch是用来做什么判断的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

1565

帖子

1

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