#include "44B.h" typedef unsigned int unint16;
/**************************************** 函数名称:I2C_Init 功能说明:完成I2C操作之前的初始化 函数参数: i2c_address:I2C设备地址(格式为00000000,最后一位不用) mode:为1时设为master模式;为0时设为slave模式 ****************************************/ void I2C_Init(int mode,int I2c_Address) { rPCONF=rPCONF|0x00000A;/*配置GPIO口为I2C功能*/ rPUPF=rPUPF|0x03;/*禁止内部上拉电阻*/ if (I2c_Address!=0) rIICADD=I2c_Address; rIICCON=0xEF;/*允许中断,允许ACK*/ if (mode==0) /*slave mode*/ rIICSTAT=0x10; else if (mode==1) /*master mode*/ rIICSTAT=0x90; else printf("I2C_Init error,check mode bit!"); }
/************************************************* 函数名称:I2C_Operetion 功能说明:完成I2C读写操作 函数变量: I2C_TxdBufferAddress:要传送的数据的起始地址 I2C_RxdBufferAddress:接受数据所放的起始地址 I2C_TxdBufferSize:要传送的数据的长度 I2C_RxdBufferSize:要接受的数据的长度 I2C_ReadWrite:为0时为发送模式;为1时为接收模式 I2C_Address:要操作的i2c设备的地址 *************************************************/
int I2C_Operation(int * I2C_TxdBufferAddress,int * I2C_RxdBufferAddress,int I2C_TxdBufferSize,int I2C_RxdBufferSize,int I2C_ReadWrite,int I2C_Address) { int I2c_data=0; int I2C_BufferSize;
if (I2C_ReadWrite==1) { rIICSTAT=rIICSTAT&0xBF;/*configure Master/receiver Mode*/ I2C_BufferSize=I2C_RxdBufferSize;} else if (I2C_ReadWrite==0) { rIICSTAT=rIICSTAT&0xFF;/*configure Master/Transmitter Mode*/ I2C_BufferSize=I2C_TxdBufferSize;} else printf("I2C_ReadWrite set error
"); return;
rIICDS=I2C_Address;/*write I2C address slave eeprom*/ rIICSTAT=rIICSTAT|0x20;/*start generation*/
while (I2C_BufferSize!=0) { if (I2C_ReadWrite==1)/*receive*/ {(*I2C_RxdBufferAddress)=((int)rIICDS);/*write data*/ I2C_RxdBufferAddress++;} else {rIICDS=(unint16)(&I2C_TxdBufferAddress); I2C_TxdBufferAddress++;} rIICCON=rIICCON&0xEF;/*Clear pending bit*/ while((rIICCON&0x10)!=0x10);/*wait for ack signal*/ I2C_BufferSize--; }
rIICSTAT=rIICSTAT&0xDF;/*stop generation*/ rIICCON=rIICCON&0xEF; while((rIICSTAT&0x06)!=0x00); }
用以上程序来调试,I2C写不了数据到eeprom里面,操作的I2C设备为KS24C080 |