打印
[技术问答]

新唐的n76e003的iic代码的理解

[复制链接]
5218|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qwe12377yu|  楼主 | 2017-7-24 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想请问这个从机发送接收代码是怎么实现的
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  File Function: N76E003 I2C Slave demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//***********************************************************************************************************
//  N76E885-series I2C slave mode demo code, the Slave address = 0xA4
//
//   ____________            _____________
//  |            |   SDA    |             |
//  |            |<-------->|             |
//  |            |          |             |
//  |N76E003(M) |          | N76E003(S) |
//  |(I2C_Master)|          | (I2C_Slave) |
//  |            |   SCL    |             |
//  |            |--------->|             |
//  |____________|          |_____________|
//
//  The protocol of I2C is same the "24LC64"
//***********************************************************************************************************


#define I2C_CLOCK               13
#define EEPROM_SLA              0xA4


UINT8 data_received[34], data_num = 0;

//========================================================================================================
void I2C_ISR(void) interrupt 6
{
    switch (I2STAT)
    {
        case 0x00:
            STO = 1;
            break;

        case 0x60:
            AA = 1;
            //P3 = 0x60;
            break;
                               
        case 0x68:
                                                P02 = 0;
            while(1);
            break;

        case 0x80:
            //P3 = 0x80;
            data_received[data_num] = I2DAT;
            data_num++;

            if (data_num == 34)
                AA = 0;
            else
                AA = 1;
            break;

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

        case 0xA0:
            //P3 = 0xA0;
            AA = 1;
            break;

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

        case 0xB8:
            //P3 = 0xB8;
            I2DAT = data_received[data_num];
            data_num++;
            AA = 1;
            break;

        case 0xC0:
            AA = 1;
            break;

        case 0xC8:
            //P3 = 0xC8;
            AA = 1;
            break;        
    }

    SI = 0;
    while(STO);
}

//========================================================================================================
void Init_I2C(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;

    /* Initial I2C function */
    Init_I2C();                                 //initial I2C circuit

    while (1);
/* =================== */
}


沙发
643757107| | 2017-7-24 19:29 | 只看该作者
全在中断里实现了。

使用特权

评论回复
板凳
wahahaheihei| | 2017-7-24 19:46 | 只看该作者
只看到了接收代码。

使用特权

评论回复
地板
a_ziliu| | 2017-7-24 22:07 | 只看该作者
在規格書中,i2c章,有收發的狀態圖

使用特权

评论回复
5
xixi2017| | 2017-7-26 10:28 | 只看该作者
     data_received[data_num] = I2DAT;

      I2DAT = data_received[data_num];
这个两个实现的,一个是接收,毒I2DAT 就是接收
写I2DAT就是发送。

使用特权

评论回复
6
nannan1218| | 2019-1-13 11:04 | 只看该作者
楼主,请问主机发送和主机接受那一块代码你理解嘛    这个通信功能你实现了吗   为啥我这边把这个程序load进去   不行啊

使用特权

评论回复
7
antusheng| | 2019-1-14 18:13 | 只看该作者
先了解IIC的协议,再来看就容易了。

使用特权

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

本版积分规则

13

主题

109

帖子

2

粉丝