打印
[技术问答]

N76E003新唐mcu做从机模拟AT24C02程序

[复制链接]
963|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccook11|  楼主 | 2024-2-29 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


#define EEPROM_SLA              0xA0   //AT24C02

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

UINT8 irxdata =0;
UINT8 isubaddr =0;


void I2C_ISR(void) interrupt 6
{

    static UINT8 islavecount=0;
   
    switch (I2STAT)
    {
        case 0x00:
            STO = 1;
        
            break;

        case 0x60:   
            AA = 1;
        
            islavecount=0;
        
            break;
                              
        case 0x68:   
                                P02 = 0;
        
            while(1);
            break;
        
        
        case 0x80:   
        
            if(islavecount==0)
            {
               isubaddr = I2DAT;
               AA = 1;
               islavecount++;
               
               data_num = isubaddr;
               
            }
            else  
            {
               irxdata = I2DAT;
               AA = 1;  
               
               data_received[data_num++]=irxdata;
               
               islavecount++;               
            }        
        
            break;      
        

        case 0x88:
        
            data_received[data_num] = I2DAT;
            data_num = 0;
            AA = 1;
        
            break;


        case 0xA0:     
            
            AA = 1;
            break;
        
        case 0xA8:     
        
            data_num=isubaddr;
        
            I2DAT = data_received[data_num];
            data_num++;
            AA = 1;
        
            break;        
        
        case 0xB8:   
        
            I2DAT = data_received[data_num];
            data_num++;
            AA = 1;
        
            break;

        case 0xC0:      
            AA = 1;
            break;

        case 0xC8:     
        
            AA = 1;

            break;        
    }

    SI = 0;
   
}


void Init_I2C_SLAVE(void)
{
    P13_Quasi_Mode;                         //set SCL (P13) is Quasi mode
    P14_Quasi_Mode;                         //set SDA (P14) is Quasi mode
   
    SDA = 1;                                //set SDA and SCL pins high
    SCL = 1;
   
    //--set_P0SR_6;                             //set SCL (P06) is  Schmitt triggered input select.
   
    set_EI2C;                               //enable I2C interrupt by setting IE1 bit 0
    set_EA;

    I2ADDR = EEPROM_SLA;                    //define own slave address
    set_I2CEN;                              //enable I2C circuit
    set_AA;
}


void main(void)
{

   Set_All_GPIO_Quasi_Mode;

   Init_I2C_SLAVE();                                 

   while (1);

}


使用特权

评论回复
沙发
tpgf| | 2024-3-1 09:46 | 只看该作者
看楼主给的代码这个应该是使用的iic通讯方式吧  

使用特权

评论回复
板凳
八层楼| | 2024-3-1 10:25 | 只看该作者
感觉这么多的id在程序烧写的时候就是个大工程

使用特权

评论回复
地板
guanjiaer| | 2024-3-1 22:20 | 只看该作者
楼主好像使用的是一种状态机的方式来运行的iic

使用特权

评论回复
5
观海| | 2024-3-1 22:51 | 只看该作者
选择语句的判据是哪里得到的呢 代码里边没有找到啊

使用特权

评论回复
6
晓伍| | 2024-3-1 23:22 | 只看该作者
iic一条总线可以带多个从设备  那么从设备的id可以动态变动吗

使用特权

评论回复
7
磨砂| | 2024-3-1 23:53 | 只看该作者
这个是调用的库函数还是自己模拟的呢 为什么这么多的分支呀

使用特权

评论回复
8
ClarkLLOTP| | 2024-3-5 15:39 | 只看该作者
switch是用来做什么判断的啊

使用特权

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

本版积分规则

34

主题

1266

帖子

0

粉丝