博客首页 | 排行榜 |

bluehacker的博客

个人档案
博文分类
MCF52259读写24c02的程序  2010-03-10 10:41

 这是一个简单的演示程序,利用MCF52259片上I2C读写24C02,用的板子是我们自己做的NSCF52259.

该程序实现的功能是:用户通过串口发送任意一个字符,NSCF52259接收到字符后,从EEPROM的地址0开始写入;并通过串口返回写入操作是否成功的提示信息;紧接着再读出刚刚写入的字符,通过串口发送给PC,用户可以使用串口调试助手之类的小工具,查看信息,从而可以对比读出的字符和写入的字符是否一致。

当此循环结束后,板子再等待用户通过串口发送下一个字符,接收到后,程序会写入EEPROM的地址1处,依次类推

 


 

/*********************************************************
@ Nicrosystem Freescale coldfire MCF52259 Development Board
@ NSCF52259-R1
@ author:bluehacker<<a href="/blog/link2url.php?link=mailto%3Anicrosystem%40gmail.com" style="text-decoration: none; color: rgb(0, 0, 128); ">nicrosystem@gmail.com>
@ date:2009-12-01
**********************************************************/
#include "i2c_driver.h"
#include "at24c02.h"
#include "delay.h"

/* write 24xxxx I2C EEPROM
* 参数:
* buf---包含待写入数据的缓冲区 
* addr---eeprom起始地址
* num--数据长度
* 返回:
* 0---success
* 1---failed
* 2---invalid address
*/
unsigned char at24c02_write(unsigned char *buf,unsigned char num,uint8 addr)
{
 unsigned char i,ret;
 
 if(addr+num>EEPROM_MAX_ADDR)
  return 2;
 
 i2c_start();
 ret=i2c_send_byte(WR24C02);
 if(ret)
 {
  i2c_stop();
  return 1;
 }
 
 ret=i2c_send_byte(addr);
 if(ret)
 {
  i2c_stop();
  return 1;
 }

 for(i=0;i
 {
  if(i2c_send_byte(buf[i]))
  {
   i2c_stop();
   return 1;
  }
 }
 i2c_stop();
 delay_ms(80000,0,5);
 return 0;
}
 
/*read 24xxxx I2C EEPROM
* arguments:
* buf---return  the data
* addr---address of cell you want to write
* num--the numner of data we want to read
* return:
* 0---success
* 1---failed
* 2---invalid address
*/
unsigned char  at24c02_read(unsigned char *buf, unsigned char num, uint8 addr)
{
 unsigned char i,ret;
 
 if(addr+num>EEPROM_MAX_ADDR)
  return 2;
 
 i2c_start();
 if(i2c_send_byte(WR24C02))
 {
  i2c_stop();
  return 1;
 }

 ret=i2c_send_byte(addr);
 if(ret)
 {
  i2c_stop();
  return 1;
 }

 i2c_restart();
 if(i2c_send_byte(RD24C02))
 {
  i2c_stop();
  return 1;
 }
 
 for(i=0;i
 {
  buf[i]=i2c_recv_byte(0);
 }
 buf[i++]=i2c_recv_byte(1);
 i2c_stop();
 return 0;
}

 


 

/*********************************************************
@ Nicrosystem Freescale coldfire MCF52259 Development Board
@ NSCF52259-R1
@ author:bluehacker<<a href="/blog/link2url.php?link=mailto%3Anicrosystem%40gmail.com" style="text-decoration: none; color: rgb(0, 0, 128); ">nicrosystem@gmail.com>
@ date:2009-12-01
**********************************************************/
#include "support_common.h" /* include peripheral declarations and more */
#include "i2c_driver.h"

void init_i2c()
{
 unsigned char temp;
 
 MCF_GPIO_PASPAR  |=MCF_GPIO_PASPAR_SCL0_SCL0 |MCF_GPIO_PASPAR_SDA0_SDA0 ;
 MCF_I2C_I2FDR(0)=MCF_I2C_I2FDR_IC(0x3A);//about 100khz
 MCF_I2C_I2ADR(0)=0xf0;
 MCF_I2C_I2CR(0)=0x80;//enable i2c
// MCF_I2C1_I2CR=0;
 if(MCF_I2C_I2SR(0)&MCF_I2C_I2SR_IBB)
 {
  MCF_I2C_I2CR(0)=0x0;
  MCF_I2C_I2CR(0)=MCF_I2C_I2CR_IEN |  /* enable module */
        MCF_I2C_I2CR_MSTA;
  temp=MCF_I2C_I2DR(0);
  MCF_I2C_I2SR(0)=0;
  MCF_I2C_I2CR(0)=0x0;
  MCF_I2C_I2CR(0)=0x80;//enable i2c
 }
}

void i2c_start()
{
 while(MCF_I2C_I2SR(0)&MCF_I2C_I2SR_IBB);
 MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_MTX ;
 MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_MSTA ; 
}


unsigned char i2c_send_byte(unsigned char c)
{
// MCF_I2C0_I2CR|=MCF_I2C_I2CR_MTX ;
// if(MCF_I2C0_I2SR|MCF_I2C_I2SR_IAL)
// {
  //arbitration lost
//  MCF_I2C0_I2SR&=~MCF_I2C_I2SR_IAL ;
// }
// i2c_start();
// MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_MTX ;
// MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_MSTA ;
 MCF_I2C_I2DR(0)=c;
 while((MCF_I2C_I2SR(0)&MCF_I2C_I2SR_IIF)==0)
 {
  
 }

 MCF_I2C_I2SR(0)&=~MCF_I2C_I2SR_IIF;
 if(MCF_I2C_I2SR(0)&MCF_I2C_I2SR_RXAK) 
  return 1;//failed
 else
     return 0;//success
}


unsigned char i2c_recv_byte(unsigned char ack)
{
 unsigned char temp;
 if(ack>0)
 {
  MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_TXAK; 
 }
 else
 {
  MCF_I2C_I2CR(0)&=~MCF_I2C_I2CR_TXAK;  
 }
 
 MCF_I2C_I2CR(0)&=~MCF_I2C_I2CR_MTX ;
 temp=MCF_I2C_I2DR(0); 
 while((MCF_I2C_I2SR(0)&MCF_I2C_I2SR_IIF)==0)
 {
  
 }
 MCF_I2C_I2SR(0)&=~MCF_I2C_I2SR_IIF;
 temp= MCF_I2C_I2DR(0);
 while((MCF_I2C_I2SR(0)&MCF_I2C_I2SR_IIF)==0)
 {
  
 }
 MCF_I2C_I2SR(0)&=~MCF_I2C_I2SR_IIF;
 return temp;
}

void i2c_stop()
{
 MCF_I2C_I2CR(0)&=~MCF_I2C_I2CR_MSTA ; 
}

void i2c_restart()
{
 MCF_I2C_I2CR(0)|=MCF_I2C_I2CR_RSTA;
}

 


 

/*********************************************************
@ Nicrosystem Freescale coldfire MCF52259 Development Board
@ NSCF52259-R1
@ author:bluehacker<<a href="/blog/link2url.php?link=mailto%3Anicrosystem%40gmail.com" style="text-decoration: none; color: rgb(0, 0, 128); ">nicrosystem@gmail.com>
@ date:2009-12-01
**********************************************************/
/*
 * main implementation: use this sample to create your own application
 *
 */
#include "support_common.h" /* include peripheral declarations and more */
#if (CONSOLE_IO_SUPPORT || ENABLE_UART_SUPPORT) 
/* Standard IO is only possible if Console or UART support is enabled. */
#include
#endif
#include "uart.h"
#include "i2c_driver.h"
#include "at24c02.h"
#include "delay.h"

int main(void)
{
 int counter = 0;
 char ch="0";
 uint8 ret="0";
 char buf[50];
 uint8 addr="0";

#if (CONSOLE_IO_SUPPORT || ENABLE_UART_SUPPORT) 
 printf("Hello World in C from MCF52259 derivative on MCF52259 board\n\r");
 fflush(stdout);
#endif
 uart_init(0,80000,19200);
 pit_init(0);
 init_i2c();
 uart_putstr(0,(char*)("Nicrosystem NSCF52259R1 i2cdemo start....\n"));
 
 for(;;) {    
     counter++;
     ch=uart_getchar(0);
     sprintf(buf,"received:%d\n",ch);
     uart_putstr(0,buf);
     ret=at24c02_write((uint8*)(&ch),1,addr);
     if(ret)
     {
      sprintf(buf,"Write ADDR#%d failed\n",addr);
      uart_putstr(0,buf);
     }
     else
     {
      sprintf(buf,"Write ADDR#%d success\n",addr);
      uart_putstr(0,buf);
     }
     ch=0;
     ret=at24c02_read((uint8*)(&ch),1,addr);
     if(ret)
     {
      sprintf(buf,"Read ADDR#%d failed\n",addr);
      uart_putstr(0,buf);
     }
     else
     {
      sprintf(buf,"Read ADDR#%d success, get:%d\n",addr,ch);
      uart_putstr(0,buf); 
     }
     addr++;
     
 }

}

类别:freescale |
上一篇:NSCF52259开发板上的SD CARD读写 | 下一篇:飞思卡尔的汽车仪表完整解决方案
以下网友评论只代表其个人观点,不代表本网站的观点或立场