testeeprom.c
Upload User: yanshikc
Upload Date: 2013-08-21
Package Size: 407k
Code Size: 3k
Development Platform:

MultiPlatform

  1. #include <mega16.h>
  2. #include <USART.h> 
  3. #include <TWI.h>
  4. #include <TWIAPP.h>
  5. #include <String.h>
  6. #include <Types.h>
  7. #include <delay.h>
  8. /************************
  9.   接线方式:
  10.   DS1302           PortC
  11.   6.VCC  5.WP1     1.PC0  2.PC1
  12.   4.SCL  3.WP2     3.PC2  4.PC3
  13.   2.SDA  1.GND     5.PC4  6.PC5
  14.                    7.PC6  8.PC7
  15.                    9.GND  10.VCC
  16.   
  17.   6.VCC --  10.VCC
  18.   4.SCL --  1.PC0
  19.   2.SDA --  2.PC1
  20.   5.WP1 --  3.PC2 (可不接)
  21.   3.WP2 --  4.PC3 (可不接)
  22.   1.GND --  9.GND
  23. ************************************/
  24.   
  25. #define MAXCMDBUF 32
  26. #pragma warn-
  27. //eeprom unsigned char EEPROMS[512];
  28. #pragma warn+
  29. void port_init(void)  //初始化各端口
  30. {
  31.  PORTB = 0xF0;
  32.  DDRB  = 0x0F;
  33.  PORTC = 0x00;
  34.  DDRC  = 0x00;
  35.  PORTB =0b11001100;
  36. }
  37. void TestCmd(void)
  38. {
  39. unsigned int i;
  40.   unsigned char CmdBuf[CMD_MAXBUFFER]; //命令缓冲区
  41.   unsigned char Chip;    //芯片地址
  42.   unsigned int Addr;     //内存地址
  43.   unsigned char AddrType;//内存地址格式 8 bit 或16 bit
  44.   unsigned int Cnt;      //读取长度
  45.   unsigned char LED;     //LED显示,作用不大
  46. USART_Init(47);  //3.6864M=23,   7.3728M=47
  47. TransmitStringF("Welcome AVR Zone");
  48. for (i=0;i<CMD_MAXBUFFER;i++) CmdBuf[i]=0;  //初始化命令缓冲区
  49. LED=0;
  50. while (1)
  51. {
  52.  ReceiveCMD(CmdBuf); //读取一条命令行
  53.    if (CmdBuf[0]>0)   //如果命令行长度不为零
  54.    {
  55.            //for (i=0;i<MAXCMDBUF;i++) TransmitByte(CmdBuf[i]);
  56.      TransmitByte(CMDBEGIN);   //送出命令开始符
  57.      TransmitByte(CmdBuf[1]);  //送出命令
  58.      if (CmdBuf[1]=='H') //如果接收的是帮助命令
  59.      {
  60.        TransmitStringF("Command format(Hex):'1B CMD 1C'");
  61.        TransmitByte(13);
  62.        TransmitStringF("Read EEPROM Data:'R','Addr','Count'");
  63.        TransmitByte(13);
  64.        TransmitStringF("Write EEPROM Data:'W','Addr','Data'");
  65.        TransmitByte(13);
  66.        TransmitStringF("Show Help:'H'");
  67.        TransmitByte(13);
  68.        PORTB=~PORTB;
  69.      }               
  70.      if (CmdBuf[1]=='R') //如果接收的是读取EEPROM命令
  71.      {
  72.        AddrType=HexToByte(&CmdBuf[2]);  //EEPROM地址类型
  73.        Chip=(HexToByte(&CmdBuf[4])&0B00001110)|EEPROM_BUS_ADDRESS; //芯片地址
  74.        Addr=(((unsigned int)HexToByte(&CmdBuf[6]))<<8)|((unsigned int)HexToByte(&CmdBuf[8])); //内存地址
  75.        Cnt=(((unsigned int)HexToByte(&CmdBuf[10]))<<8)|((unsigned int)HexToByte(&CmdBuf[12])); //读写个数
  76.        if (Addr+Cnt>255) Cnt=255-Addr;
  77.        for (i=0;i<Cnt;i++) 
  78.          {
  79.           TransmitString(ByteToHex(EEPROM_Read(Chip,AddrType,Addr+i)));  //送回上位机
  80.           TransmitByte(32);
  81.          }
  82.      }
  83.      if (CmdBuf[1]=='W') //如果接收的是写入EEPROM命令
  84.      { 
  85.        AddrType=HexToByte(&CmdBuf[2]);
  86.        Chip=(HexToByte(&CmdBuf[4])&0B00001110)|EEPROM_BUS_ADDRESS;
  87.        Addr=(((unsigned int)HexToByte(&CmdBuf[6]))<<8)|((unsigned int)HexToByte(&CmdBuf[8]));
  88.        EEPROM_Write(Chip,AddrType,Addr,HexToByte(&CmdBuf[10]));
  89.        delay_ms(5);  //写EEPROM的时候要隔5ms
  90.        TransmitString(ByteToHex(EEPROM_Read(Chip,AddrType,Addr)));  //回送给上位机做检查
  91.      }
  92.    TransmitByte(CMDEND); //送出命令结束符
  93.    for (i=0;i<CMD_MAXBUFFER;i++) CmdBuf[i]=0;  //清空命令缓冲区
  94.    }
  95. LED++;
  96. //PORTB&=~((LED>>7)&0x03);
  97. }
  98. }
  99. void main()
  100. {
  101. port_init();
  102. TWI_DefaultInit();
  103.   TestCmd();
  104. }
  105.