英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3609|回复: 0
打印 上一主题 下一主题

用PIC的硬件MSSP i2c读写e2prom

[复制链接]
跳转到指定楼层
1#
发表于 2009-5-22 13:56:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "e:\codefile\rf_card\pic1687x.h"
/*********************************************************************
* 模块名:  EEROM读写模块
*芯片型号: 24LC512
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
static uchar bank1 buffer[20];
const unsigned char TAB1[10]={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[2];
     }eeprom_addr;
   eeprom_addr.i=eep_addr;
   eep_start();
   SSPBUF=0xa0; file://24lc512硬件写地址
      do {
   ;
    }while(SSPIF==0);
            SSPIF=0;
    SSPBUF=eeprom_addr.addr_eep[0];
       do{
  ;}while(SSPIF==0);
  SSPIF=0;
    SSPBUF=eeprom_addr.addr_eep[1];
     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[2];
    }eep_addr_w;
    eep_addr_w.i=eep_addr;
    eep_start();
    SSPBUF=0xa0;
       do{
           ;}while(SSPIF==0);
         SSPIF=0;
    SSPBUF=eep_addr_w.addr[0];
       do{
          ;}while(SSPIF==0);
           SSPIF=0;
    SSPBUF=eep_addr_w.addr[1];
     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[20]={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 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-25 09:36 , Processed in 0.052526 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表