📄 testiic.c
字号:
/***************************************优龙科技责任有限公司*********************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: TestIic.c
**创 建 人: cgf
**最后修改日期: 2005-11-28
**描 述: IIC读写实验代码
**
********************************************************************************************************/
#include <stdio.h>
#include "regsdef.h"
#include "XsClkMgr.h"
#include "utils.h"
/*************************************************************/
//#define IIC_DEBUG
#ifdef IIC_DEBUG
#define iic_debug printf
#else
#define iic_debug(...)
#endif
/*************************************************************/
#define ICR_FM (1<<15) //0=100k,1=400k
#define ICR_UR (1<<14) //0=no reset, 1=reset
#define ICR_SADIE (1<<13) //1=slave address detect interrupt enable
#define ICR_ALDIE (1<<12)
#define ICR_SSDIE (1<<11) //1=slave stop detect interrupt enable
#define ICR_BEIE (1<<10)
#define ICR_IRFIE (1<<9)
#define ICR_ITEIE (1<<8)
#define ICR_GCD (1<<7)
#define ICR_IUE (1<<6)
#define ICR_SCLE (1<<5)
#define ICR_MA (1<<4)
#define ICR_TB (1<<3)
#define ICR_ACKNAK (1<<2)
#define ICR_STOP (1<<1)
#define ICR_START (1<<0)
#define ISR_BED (1<<10)
#define ISR_SAD (1<<9)
#define ISR_GCAD (1<<8)
#define ISR_IRF (1<<7)
#define ISR_ITE (1<<6)
#define ISR_ALD (1<<5)
#define ISR_SSD (1<<4)
#define ISR_IBB (1<<3)
#define ISR_UB (1<<2)
#define ISR_ACKNAK (1<<1)
#define ISR_RWM (1<<0)
#define IIC_WR 0
#define IIC_RD 1
/*****************************************************************************
** 函数名称: iic_set_addr
** 功能描述: 设置IIC器件地址
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static int iic_set_addr(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
int isr;
IICISR = 0x7ff;
IDBR = saddr;
ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_START;
while(ICR&ICR_TB);
isr = IICISR;
iic_debug("%x\n", isr);
IICISR = isr&0x7ff;
if(isr&(ISR_BED))
return -1;
while(addrcnt) {
IDBR = *addr++;
ICR = ICR_IUE|ICR_SCLE|ICR_TB;
while(ICR&ICR_TB);
isr = IICISR;
iic_debug("%x\n", isr);
IICISR = isr&0x7ff;
addrcnt--;
if(isr&(ISR_BED))
return -1;
}
return 0;
}
/*****************************************************************************
** 函数名称: iic_set_wr
** 功能描述:
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_set_wr(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
return iic_set_addr((saddr<<1)|IIC_WR, addr, addrcnt);
}
/*****************************************************************************
** 函数名称: iic_set_rd
** 功能描述:
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_set_rd(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
if(iic_set_addr((saddr<<1)|IIC_WR, addr, addrcnt))
return -1;
return iic_set_addr((saddr<<1)|IIC_RD, NULL, 0);
}
/*****************************************************************************
** 函数名称: iic_wr_byte
** 功能描述: 向IIC写一个字节
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_wr_byte(UCHAR data)
{
int isr;
IDBR = data;
ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_STOP;
while(ICR&ICR_TB);
isr = IICISR;
iic_debug("%x\n", isr);
IICISR = isr&0x7ff;
ICR &= ~ICR_STOP;
if(isr&(ISR_BED))
return -1;
return 0;
}
/*****************************************************************************
** 函数名称: iic_rd_byte
** 功能描述: 从IIC器件读一个字节
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_rd_byte(UCHAR *data)
{
int isr;
ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_ACKNAK|ICR_STOP;
while(!(IICISR&ISR_IRF));
isr = IICISR;
iic_debug("%x\n", isr);
IICISR = isr&0x7ff;
*data = IDBR;
ICR &= ~(ICR_ACKNAK|ICR_STOP);
return 0;
}
/*****************************************************************************
** 函数名称: InitIicCtrl
** 功能描述: IIC初始化
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
VOID InitIicCtrl(VOID)
{
xsCMEnableClock(I2C_CE);
ICR = ICR_UR; //reset iic unit
DM_WaitMs(10);
ICR = ICR_IUE|ICR_SCLE;
ISAR = 0x12; //in slave mode, slave address
}
/*************************************************************/
/*****************************************************************************
** 函数名称: iic_rom_test
** 功能描述: IIC读写测试
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
#define IIC_ROM_ADDR 0x50
//at24c02/04/08使用8位地址索引,04/08使用a0-a2做page索引
static void iic_rom_test(void)
{
UCHAR iaddr, data;
InitIicCtrl();
/*xsCMEnableClock(I2C_CE);
ICR = ICR_UR; //reset iic unit
DM_WaitMs(10);
ICR = ICR_IUE|ICR_SCLE;
ISAR = 0x12; //in slave mode, slave address
*/
printf("IIC ROM wrtite\r\n");
for(iaddr=0; iaddr<0x80; iaddr++) {
if(iic_set_wr(IIC_ROM_ADDR, &iaddr, 1)) {
printf("fail to set IIC ROM address for write\n");
return;
} else {
if(iic_wr_byte(0x80-iaddr-1))
//if(iic_wr_byte(iaddr))
printf("fail to write byte to IIC ROM\n");
else {
if(!(iaddr%16))
printf("0x%02x : ", iaddr);
printf("%4x", (0x80-iaddr-1));
//printf("%4x", (iaddr));
if(!((iaddr+1)%16))
printf("\r\n");
}
}
DM_WaitMs(10); //delay for write
}
printf("IIC ROM read\r\n");
for(iaddr=0; iaddr<0x80; iaddr++) {
if(iic_set_rd(IIC_ROM_ADDR, &iaddr, 1)) {
printf("fail to set IIC ROM address for read\r\n");
return;
} else {
if(iic_rd_byte(&data))
printf("fail to read byte from IIC ROM\r\n");
else {
if(!(iaddr%16))
printf("0x%02x : ", iaddr);
printf("%4x", data);
if(!((iaddr+1)%16))
printf("\r\n");
}
}
}
xsCMDisableClock(I2C_CE);
printf("IIC ROM test complete\r\n");
}
/*****************************************************************************
** 函数名称: DeinIicCtrl
** 功能描述: 禁止IIC的时钟
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
VOID DeintIicCtrl(VOID)
{
xsCMDisableClock(I2C_CE);
}
/*****************************************************************************
** 函数名称: WriteIicDev
** 功能描述: 向IIC写数据
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
INT WriteIicDev(UCHAR saddr, UCHAR iaddr, UCHAR data)
{
if(iic_set_wr(saddr, &iaddr, 1))
return -1;
if(iic_wr_byte(data))
return -1;
return 0;
}
/*****************************************************************************
** 函数名称: ReadIicDev
** 功能描述: IIC读数据
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
INT ReadIicDev(UCHAR saddr, UCHAR iaddr, PUCHAR data)
{
if(iic_set_rd(saddr, &iaddr, 1))
return -1;
if(iic_rd_byte(data))
return -1;
return 0;
}
/*****************************************************************************
** 函数名称: TestIic
** 功能描述: IIC测试程序
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
void TestIic(void)
{
iic_rom_test(); //IIC测试函数
}
/********************End of File*********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -