i2c_24c02.c.bak

来自「uCos应用」· BAK 代码 · 共 264 行

BAK
264
字号
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: I2C_24C02.c
** Last modified Date: 2006-11-15 
** Last Version: v1.0
** Description: Stellaris系列单片机模拟I2C主方式读写CAT24C02。
** 
**------------------------------------------------------------------------------------------------------
** Created By: zha jinzhong
** Created date: 2006-11-15 
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
/*#include "hw_i2c.h"
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "i2c.h"
#include "interrupt.h"
#include "sysctl.h"		*/	

#include <includes.h>
#define CSI24c02  0x50        // 从机地址,注意需将原从机地址左移一位。
#define writeaddr 0x00        // 对24c02操作的子地址。
#define readaddr  0x00
#define rightled  GPIO_PIN_4  // 数据判断指示灯的设置。
#define wrongled  GPIO_PIN_5

#define STATE_IDLE         0  // I2C总线的相关的操作状态。
                              // 状态0,总线空闲状态。
#define STATE_WRITE_NEXT   1  // 状态1,写下一个数据状态。
#define STATE_WRITE_FINAL  2  // 状态2,写最后一个数据。
#define STATE_WAIT_ACK     3  // 状态3,返回一个应答信号,以指示读操作已经完成。
#define STATE_SEND_ACK     4  // 状态4,等待应答信号。
#define STATE_READ_ONE     5  // 状态5,读取一个字节的数据。
#define STATE_READ_FIRST   6  // 状态6,读取字符串的首数据。
#define STATE_READ_NEXT    7  // 状态7,读取下一个数据。
#define STATE_READ_FINAL   8  // 状态8,读取最后一个数据。
#define STATE_READ_WAIT    9  // 状态9,读取数据的最终状态。

//-----------------------------------------------------------------------------------------
// 此变量存储将被发送或接收的数据。
//-----------------------------------------------------------------------------------------
//static unsigned char *g_pucData = 0;
//static unsigned long g_ulCount = 0;
//-----------------------------------------------------------------------------------------
// 中断服务程序的当前状态。
//-----------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------
//
// EEPROM写操作
// 输入参数:puData:    待发送的数据。
//           ulOffset:  器件的子地址。
//           ulCount:   待发送数据的个数。
// 返回参数:无。
//-----------------------------------------------------------------------------------------
void EEPROMWrite(unsigned char *pucData,unsigned long ulOffset,unsigned long ulCount)
{
	ISendStr(CSI24c02, ulOffset, 1, pucData, ulCount);
}

//-----------------------------------------------------------------------------------------
//
// EEPROM读操作
// 输入参数:puData:    读取的数据。
//           ulOffset:  器件的子地址。
//           ulCount:   读取数据的个数。
// 返回参数:无。
//
//-----------------------------------------------------------------------------------------
void EEPROMRead(unsigned char *pucData, unsigned long ulOffset,unsigned long ulCount)
{
	IRcvStr(CSI24c02, ulOffset, 1, pucData,  ulCount);
}



#if 0

//-----------------------------------------------------------------------------------------
//
// I2C中断服务程序
//
//-----------------------------------------------------------------------------------------
void I2C_ISR(void)
{
    // 清除I2C中断
    //I2CMasterIntClear(I2C_MASTER_BASE);
	HWREG(I2C_MASTER_BASE + 0X01C) = 1;

    // 根据当前状态执行相关操作
    switch( g_ulState )
    {
        // 空闲状态
        case STATE_IDLE:
        {
            break;
        }

        // 写下一个数据。
        case STATE_WRITE_NEXT:
        {
            // 将下一个字节写入数据寄存器
            I2CMasterDataPut(I2C_MASTER_BASE, *g_pucData++);
            g_ulCount--;

            // 继续执行块写操作
            I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);

            // 如果只剩下一个字节,则将下一个状态设置为最终写状态。
            if(g_ulCount == 1)
            {
                g_ulState = STATE_WRITE_FINAL;
            }
            break;
        }

        // 写最后一个数据。
        case STATE_WRITE_FINAL:
        {
            // 写最后的字节到数据寄存器。
            I2CMasterDataPut(I2C_MASTER_BASE, *g_pucData++);
            g_ulCount--;

            // 完成块写。
            I2CMasterControl(I2C_MASTER_BASE,
                             I2C_MASTER_CMD_BURST_SEND_FINISH);

            // 下一个状态为等待块写完成状态。
            g_ulState = STATE_SEND_ACK;

            break;
        }

        // 等待应答信号。
        case STATE_WAIT_ACK:
        {
            // 判断前一次读操作是否有错误。
            if(I2CMasterErr(I2C_MASTER_BASE) == I2C_MASTER_ERR_NONE)
            {
                // 读取接收到的数据。
                I2CMasterDataGet(I2C_MASTER_BASE);

                // 如果没有错误,进入空闲状态。
                g_ulState = STATE_IDLE;

                break;
            }
        }

        // 返回一个应答信号,以指示读操作已经完成。
        case STATE_SEND_ACK:
        {
            // 设置I2C主机为接收模式
            I2CMasterSlaveAddrSet(I2C_MASTER_BASE, CSI24c02, true);

            // 进行单字节读操作
            I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

            // 等待ACK信号
            g_ulState = STATE_WAIT_ACK;

            break;
        }
        
        // 读取一个字节的数据。
        case STATE_READ_ONE:
        {
            // 设置I2C主机为接收模式
            I2CMasterSlaveAddrSet(I2C_MASTER_BASE, CSI24c02, true);

            //  进行单字节读操作
            I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

            // 下一个状态机将为等待最终读状态。
            g_ulState = STATE_READ_WAIT;

            break;
        }

        // 读取字符串的首数据。
        case STATE_READ_FIRST:
        {
            // 设置I2C主机为接收模式
            I2CMasterSlaveAddrSet(I2C_MASTER_BASE, CSI24c02, true);

            // 开始接收块。
            I2CMasterControl(I2C_MASTER_BASE,
                             I2C_MASTER_CMD_BURST_RECEIVE_START);

            // 下一个状态为块读取中状态。
            g_ulState = STATE_READ_NEXT;

            break;
        }

        // 读取下一个数据。
        case STATE_READ_NEXT:
        {
            // 读取接收到的字符。
            *g_pucData++ = I2CMasterDataGet(I2C_MASTER_BASE);
            g_ulCount--;

            // 继续块读取操作
            I2CMasterControl(I2C_MASTER_BASE,
                             I2C_MASTER_CMD_BURST_RECEIVE_CONT);

            // 如果仅剩下两个字节,下一状态将为快读取结束状态。
            if(g_ulCount == 2)
            {
                g_ulState = STATE_READ_FINAL;
            }
            break;
        }

        // 块读取结束状态。
        case STATE_READ_FINAL:
        {
            // 读取接收到的字符。
            *g_pucData++ = I2CMasterDataGet(I2C_MASTER_BASE);
            g_ulCount--;

            // 完成块读取操作。
            I2CMasterControl(I2C_MASTER_BASE,
                             I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

            // 下一个状态为等待块读取最终状态。
            g_ulState = STATE_READ_WAIT;

            // 此状态已完成。
            break;
        }

        // 读字节或者读块的最终状态。
        case STATE_READ_WAIT:
        {
            // 读取接收到的字符。
            *g_pucData++  = I2CMasterDataGet(I2C_MASTER_BASE);
            g_ulCount--;

            // 设置状态机为空闲。
            g_ulState = STATE_IDLE;

            // 此状态已完成。
            break;
        }
    }
}
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?