用PIC的硬件MSSP i2c读写e2prom
#include "e:\codefile\rf_card\pic1687x.h"/*********************************************************************
* 模块名:EEROM读写模块
*芯片型号: 24LC512
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
static uchar bank1 buffer;
const unsigned char TAB1={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
/********************************************************************
*
* 名称: wait_ms
* 说明:
* 功能: 延时n ms
* 调用: 无
* 输入: ms 延时毫秒数,ms=n 延时n ms.
* 返回值: 无
***********************************************************************/
void wait_ms(uchar ms)
{
uchar i;
for(;ms>0;--ms)
for(i=248;i>0;--i)
{
asm("nop");
asm("nop");
}
return;
}
/********************************************************************
*
* 名称: mssp_initi
* 说明:
* 功能: MSSP模块初始化函数
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void mssp_initi(void)
{
INTCON=0;
TRISB=0; file://OUT
TRISC3=1;
TRISC4=1;
SSPSTAT=0x80;
file://传输数率设为100KHZ
SSPADD=9;
SSPCON=0x08;
SSPCON2=0x00;
SSPIF=0;
SSPEN=1;file://起用SSP模块 ,iic
return;
}
/********************************************************************
*
* 名称: eep_start
* 说明:
* 功能: 产生一个起使位
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void eep_start (void)
{
uchar i;
SSPIF=0;
SEN=1;
for(i=2;--i;)continue;
do {
RSEN=1;
}while(SSPIF==0);
SSPIF=0;
return;
}
/********************************************************************
*
* 名称: eep_stop
* 说明:
* 功能: 产生一个停止位
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void eep_stop(void)
{
PEN=1;
do {
;
}while(SSPIF==0);
SSPIF=0;
return;
}
/********************************************************************
*
* 名称: eep_read_byte
* 说明:
* 功能: 读24lc512指定1 byte数
* 调用: eep_start,eep_stop
* 输入: uint eep_addr 要读的地址,uchar*p 缓存单元
* 返回值: data
***********************************************************************/
uchar eep_read_byte(uint eep_addr)
{
uchar data;
union addr_r
{
uint i;
uchar addr_eep;
}eeprom_addr;
eeprom_addr.i=eep_addr;
eep_start();
SSPBUF=0xa0; file://24lc512硬件写地址
do {
;
}while(SSPIF==0);
SSPIF=0;
SSPBUF=eeprom_addr.addr_eep;
do{
;}while(SSPIF==0);
SSPIF=0;
SSPBUF=eeprom_addr.addr_eep;
do{
;}while(SSPIF==0);
SSPIF=0;
eep_stop();
eep_start();
SSPBUF=0xa1; file://24lc512硬件读地址
do{
;}while(SSPIF==0);
SSPIF=0;
RCEN=1;
do{
;}while(SSPIF==0);
SSPIF=0;
data=SSPBUF;
eep_stop();
return(data);
}
/********************************************************************
*
* 名称: eep_write_byte
* 说明:
* 功能: 写24lc512指定1 byte数
* 调用: eep_start,eep_stop
* 输入: uint eep_addr 要写的地址,uchar 写缓存
* 返回值:
***********************************************************************/
void eep_write_byte(uint eep_addr,uchar *p)
{
union addr_w
{
uint i;
uchar addr;
}eep_addr_w;
eep_addr_w.i=eep_addr;
eep_start();
SSPBUF=0xa0;
do{
;}while(SSPIF==0);
SSPIF=0;
SSPBUF=eep_addr_w.addr;
do{
;}while(SSPIF==0);
SSPIF=0;
SSPBUF=eep_addr_w.addr;
do{
;}while(SSPIF==0);
SSPIF=0;
SSPBUF=*p;
do{
;}while(SSPIF==0);
SSPIF=0;
eep_stop();
wait_ms(10);
return;
}
/********************************************************************
*
* 名称: Read_24lc512
* 说明:
* 功能: 读24lc512
* 调用: eep_read_byte
* 输入: uint read_address 要读的起使地址,uchar read_length 读段长度,uchar*point 指向读缓冲区
* 返回值: 无
***********************************************************************/
void Read_24lc512(uint read_address,uchar read_length,uchar *point)
{
do{
*point=eep_read_byte(read_address);
read_address++;
*point++;
read_length--;
}while(read_length);
}
/********************************************************************
*
* 名称: Write_24lc512
* 说明:
* 功能: 写24lc512
* 调用: eep_write_byte
* 输入: uint read_address 要写的起使地址,uchar read_length 写段长度,uchar*point 指向写缓冲区
* 返回值: 无
***********************************************************************/
void Write_24lc512(uint write_address,uchar write_length,uchar *point)
{
do{
eep_write_byte(write_address,point);
write_address++;
*point++;
write_length--;
}while(write_length);
}
/********************************************************************
*
* 名称: main
* 说明: 测试24lc512程序
* 功能: 将数组array的20个数写入从0000H到0014H地址的20个24L512单元,
* 再读24lc512的0000H到0014H单元保存到buffer数组。
* 调用: Write_24lc512,Read_24lc512
* 输入: 无
* 返回值: 无
***********************************************************************/
main()
{ uchar array={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
mssp_initi();
Write_24lc512(0x0000,20,array);
Read_24lc512(0x0000,0x14,buffer);
do{
;}while(1);
}
页:
[1]