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 + -
显示快捷键?