亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eeprom.c

?? CC2430多功能綜合測試程序,zigbee協議下的通信開發源碼
?? C
字號:
/******************************************************************************
Filename:     eeprom.c
Target:       cc2430
Revised:      16/12-2005
Revision:     1.0

Description:
Function implementations for common EEPROM functions for use with the CC2430DB.

******************************************************************************/


#include "eeprom.h"
#include "ioCC2430.h"
#include "hal.h"
#include "CC2430DB.h"

// Prototypes for internal EEPROM functions
BYTE writeEEPromBlock(BYTE* buffer, INT8 length, WORD address);
void smbEESend(BYTE *buffer, const UINT8 n);
BOOL smbEESendByte(BYTE b);
void smbEEWrite(BOOL value);
void smbEEReceive(BYTE address, UINT16 length, BYTE *buffer);
BYTE smbEEReceiveByte(BOOL lastByte);
BOOL EEPromWrapCheck(INT8 length, WORD address);
void smbEEClock(BOOL value);
void smbEEStart();
void smbEEStop();
void waitEE();


#define DATA_HIGH()    do{IO_DIR_PORT_PIN(0, 2, IO_IN);} while(0)
#define DATA_LOW()     do{IO_DIR_PORT_PIN(0, 2, IO_OUT); EE_SDA = 0;}while(0)

#define EEPROM_WRITEADDRESS   0xA0
#define EEPROM_READADDRESS    0xA1

#define PAGE_SIZE 32
// 32 k bit = 4096 BYTE
#define PROM_SIZE (0x1000)

#define WAIT_FOR_WRITE_DELAY 0x03


/******************************************************************************
* See eeprom.h for a description of this function.
******************************************************************************/
void initEEProm(void)
{
   // Setting the ports as inputs.
   IO_DIR_PORT_PIN(0, 2, IO_IN);
   IO_DIR_PORT_PIN(0, 3, IO_IN);

   // Setting P0_2 and P0_3 for general IO operation.
   IO_FUNC_PORT_PIN(0, 2, IO_FUNC_GIO);
   IO_FUNC_PORT_PIN(0, 3, IO_FUNC_GIO);

   // Setting ports for pull-up.
   IO_IMODE_PORT_PIN(0, 2, IO_IMODE_PUD);
   IO_IMODE_PORT_PIN(0, 3, IO_IMODE_PUD);
   IO_PUD_PORT(0, IO_PULLUP);
}


/******************************************************************************
* See eeprom.h for a description of this function.
******************************************************************************/
BOOL readEEProm(BYTE* buffer, WORD address, UINT8 length)
{
   BYTE i;
   BYTE transmitBuffer[3];

   transmitBuffer[0] = EEPROM_WRITEADDRESS;
   transmitBuffer[1] = (BYTE) (address >> 8);
   transmitBuffer[2] = (BYTE) (address);

   smbEEStart();
   for(i = 0; i < 3; i++){
      while(!smbEESendByte(transmitBuffer[i])); //Keep sending until ACK received
   }

   smbEEClock(0);
   waitEE();
   DATA_HIGH();
   smbEEClock(1);

   smbEEReceive(EEPROM_READADDRESS, length, buffer);

   return TRUE;
}


/******************************************************************************
* See eeprom.h for a description of this function.
******************************************************************************/
BYTE writeEEProm(BYTE* buffer, WORD address, UINT8 length)
{
   UINT8 i;
   UINT8 currentPageLength;
   UINT8 pageOffset;

   if(((WORD)address + length) > (WORD)PROM_SIZE){
      // Trying to write to a higher address than max address
      return FALSE;
   }

   if( pageOffset = (address & 0x1F) ){
      // Write to first page if address is not 32 bytes aligned
      if( pageOffset + length > PAGE_SIZE ){
         currentPageLength = PAGE_SIZE - pageOffset;
      }
      else{
         currentPageLength = length;
      }

      writeEEPromBlock(&buffer[0], currentPageLength, address);
      // Wait for internal write cycle to finish
      halWait(WAIT_FOR_WRITE_DELAY);
   }
   else{
      // Address is 32 bytes aligned
      pageOffset = 0;
      currentPageLength = 0;
   }

   for( i = currentPageLength; i < length; i += PAGE_SIZE ){
      if( i + PAGE_SIZE < length ) {
         currentPageLength = PAGE_SIZE;
      }
      else{
         currentPageLength = length - i;
      }
      writeEEPromBlock(&buffer[i], currentPageLength, address + i);
      // Wait for internal write cycle to finish
      halWait(WAIT_FOR_WRITE_DELAY);
   }

   return TRUE;
}


/******************************************************************************
* See eeprom.h for a description of this function.
* length must be less or equal 32
******************************************************************************/
BYTE writeEEPromBlock(BYTE* buffer, INT8 length, WORD address)
{
   UINT8 i = 0;
   UINT8 j;
   BYTE transmitBuffer[35];

   transmitBuffer[i++] = EEPROM_WRITEADDRESS;
   transmitBuffer[i++] = (BYTE) (address >> 8);
   transmitBuffer[i++] = (BYTE) (address);

   for(j = 0; j < length; j++)
   {
      transmitBuffer[i++] = buffer[j];
   }

   smbEESend(transmitBuffer, i);
   return TRUE;
}


/******************************************************************************
* See eeprom.h for a description of this function.
******************************************************************************/
void eraseEEProm(void)
{
   WORD j;
   UINT8 i;
   BYTE transmitBuffer[35];

   transmitBuffer[0] = EEPROM_WRITEADDRESS;
   for(i = 0; i < PAGE_SIZE; i++)
   {
      transmitBuffer[i + 3] = 0;
   }

   for(j = 0; j < PROM_SIZE; j += PAGE_SIZE)
   {
      transmitBuffer[1] = (BYTE) (j >> 8);
      transmitBuffer[2] = (BYTE) (j);

      smbEESend(transmitBuffer, 35);
      // Wait for internal write cycle to finish
      halWait(WAIT_FOR_WRITE_DELAY);
   }
}


/******************************************************************************
* Internal function for eeprom.c
******************************************************************************/
void smbEESend(BYTE *buffer, const UINT8 n){
   UINT8 i = 0;
   smbEEStart();
   for(i = 0; i < n; i++){
      while(!smbEESendByte(buffer[i])); //Keep sending until ACK received
   }
   smbEEClock(0);
   smbEEClock(1);
   DATA_LOW();
   smbEEStop();
}


/******************************************************************************
* Internal function for eeprom.c
******************************************************************************/
BOOL smbEESendByte(BYTE b){
   UINT8 i;
   BOOL ack;
   for (i = 0; i < 8; i++){
      smbEEWrite(b & 0x80);
      b = (b <<  1);
   }
   smbEEClock(0);
   DATA_LOW();
   smbEEClock(1);
   ack = !EE_SDA;
   return ack; //high = ACK received, else ACK not received
}


/******************************************************************************
* Internal function for eeprom.c
* Function for writing bit to the data line. Setting the port as input
* make the SMBus go high because of the pull-up resistors.
*
******************************************************************************/
void smbEEWrite(BOOL value){
   smbEEClock(0);
   if(value){
      DATA_HIGH();
   }
   else{
      DATA_LOW();
   }
   smbEEClock(1);
}


/******************************************************************************
* Internal function for eeprom.c
******************************************************************************/
void smbEEReceive(BYTE address, UINT16 length, BYTE *buffer){
   UINT16 i;

   smbEEStart();
   DATA_HIGH();
   //smbEEClock(1);

   while (!smbEESendByte(address)); //Keep sending address until ACK'ed
   smbEEClock(0);
   DATA_HIGH();

   // (CLK is high and data is high)
   for(i = 0; i < length; i++){
      buffer[i] = smbEEReceiveByte( i==(length-1) ); //TRUE if last byte
      halWait(0x01);
   }

   smbEEClock(1);
   smbEEStop();
}


/******************************************************************************
* Internal function for eeprom.c
******************************************************************************/
BYTE smbEEReceiveByte(BOOL lastByte){
   INT16 i;
   BYTE inData = 0;

   DATA_HIGH();

   for(i = 0; i < 8 * 2; i++){
      if(EE_SCL == 1){ 	//clk high
         if(EE_SDA){ 	//read '1'
            inData = (inData<<1) | 0x01;
         } else {
            inData = (inData<<1) & ~0x01;
         }
         smbEEClock(0);
      }
      else{
         smbEEClock(1);
      }
   }
   smbEEClock(0);

   //do not ACK if last byte
   //lastByte ? smbEEWrite(1) :  smbEEWrite(0);

   DATA_LOW();
   smbEEClock(1);
   smbEEClock(0);

   return inData;
}


/******************************************************************************
* Internal function for eeprom.c
* This function is used to clock the SMBus connected to the LCD. If a negative
* edge is to follow, the pin is set as an output and driven low. If a positive
* edge is to follow, the pin is set as an input and the pull-up resistor is
* to drive the node high. This way the slave device can hold the node low if
* a longer setup time is desired.
*
******************************************************************************/
void smbEEClock(BOOL value){
   if(!value){
      IO_DIR_PORT_PIN(0, 3, IO_OUT);
      EE_SCL = 0;
   }
   else {
      IO_DIR_PORT_PIN(0, 3, IO_IN);
   }
   waitEE();
}

/******************************************************************************
* Internal function for eeprom.c
* This function initiates SMBus communication. It makes sure that both the
* data and the clock of the SMBus are high. Then the data pin is set low
* while the clock is kept high. This initializes SMBus transfer.
*
******************************************************************************/
void smbEEStart(){
   while (! (EE_SDA && EE_SCL) )
   {
      DATA_HIGH();
      smbEEClock(0);
      smbEEClock(1);
   }//wait for Data and clk high
   DATA_LOW();
   waitEE();
   smbEEClock(0);
}

/******************************************************************************
* Internal function for eeprom.c
* This function terminates SMBus communication. It makes sure that the data
* and clock of the SMBus are low and high, respectively. Then the data pin is
* set high while the clock is kept high. This terminates SMBus transfer.
*
******************************************************************************/
void smbEEStop(){
   while (! (!EE_SDA && EE_SCL))
   {
      DATA_LOW();
      smbEEClock(0);
      smbEEClock(1);
   }
   DATA_HIGH();
   smbEEClock(1);
   waitEE();
}


/******************************************************************************
* Internal function for eeprom.c
******************************************************************************/
void waitEE(){
   UINT8 j = 0x01;
   while(j--);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区免费观看| 国产精品66部| 国产亚洲欧美在线| 久久久亚洲综合| 国产精品欧美经典| 久久www免费人成看片高清| 久久99精品久久久久久动态图| 丁香网亚洲国际| 91精品国模一区二区三区| 中文字幕免费不卡| 欧美三级日韩三级国产三级| 麻豆极品一区二区三区| 欧美一区二区在线看| 同产精品九九九| 日韩限制级电影在线观看| 国产精品全国免费观看高清| 国产毛片精品一区| 91麻豆精品国产91久久久久| 亚洲国产精品麻豆| 色综合 综合色| 一区二区在线免费观看| 懂色av噜噜一区二区三区av| 欧美一区二区三区爱爱| 亚洲天堂a在线| 国产成人aaa| 中文一区二区完整视频在线观看| 99久久综合国产精品| 青娱乐精品在线视频| 国产精品理论片在线观看| 中文字幕av一区二区三区免费看 | 蜜臀av性久久久久蜜臀av麻豆| 一区二区三区在线观看视频| 男人的天堂久久精品| 国产精华液一区二区三区| 欧美午夜一区二区| 国产精品久久久久三级| 国产精品网站导航| 欧美精品一区二区久久久| 欧美精品一级二级| 欧美猛男gaygay网站| 欧美色精品在线视频| 色婷婷综合中文久久一本| 精品一区二区三区日韩| 日韩精品91亚洲二区在线观看 | 99久久精品国产导航| 欧美亚洲自拍偷拍| 精品噜噜噜噜久久久久久久久试看| 欧美亚一区二区| 成人蜜臀av电影| 国产成人久久精品77777最新版本| 91小视频免费观看| 久久日韩精品一区二区五区| 一区二区三区在线观看欧美| 欧美天堂一区二区三区| 国产精品素人视频| 蜜桃久久久久久| 久久精品一区二区三区不卡牛牛| 不卡高清视频专区| 国产不卡一区视频| 色婷婷国产精品久久包臀| 在线欧美日韩国产| 一区二区三区自拍| 手机精品视频在线观看| 美国毛片一区二区三区| 成人性生交大片免费看在线播放| 久久综合成人精品亚洲另类欧美| 午夜不卡av在线| 91原创在线视频| 亚洲国产精品二十页| 国产乱淫av一区二区三区| 精品国产123| 亚洲最色的网站| 国产一区二区三区综合| 成人美女视频在线观看18| 色久综合一二码| 在线精品视频免费观看| 欧美美女直播网站| 欧美成人在线直播| 中文字幕亚洲欧美在线不卡| 天天综合天天做天天综合| 99久久久国产精品免费蜜臀| 欧美一区二区免费视频| 日韩欧美在线一区二区三区| 亚洲最新在线观看| 日本一不卡视频| 国产成人aaa| 91欧美一区二区| 99免费精品在线观看| 极品少妇xxxx偷拍精品少妇| 国产成人免费视频网站高清观看视频| 中文字幕视频一区二区三区久| av午夜精品一区二区三区| 欧美日韩免费高清一区色橹橹| 国产欧美精品一区aⅴ影院| 亚洲超丰满肉感bbw| jizz一区二区| 国产精品色在线观看| 国产白丝精品91爽爽久久| 久久亚洲一级片| 国产福利一区在线| 国产精品免费人成网站| thepron国产精品| 国产欧美日韩亚州综合| 成人久久久精品乱码一区二区三区| 2023国产精品自拍| 国产精品色呦呦| 国产不卡一区视频| 国产精品天干天干在线综合| 亚洲精品中文在线| 国产精品免费视频网站| 青青青伊人色综合久久| 91丝袜国产在线播放| 久久影院视频免费| 日韩**一区毛片| 欧美无乱码久久久免费午夜一区| 久久久午夜精品理论片中文字幕| 午夜欧美一区二区三区在线播放| 99视频在线精品| 精品国产一区久久| 日本一区中文字幕| 99国产精品99久久久久久| 日韩亚洲电影在线| 欧美在线播放高清精品| 国产在线观看免费一区| 国产精品久久久久aaaa樱花| 99精品视频在线免费观看| 亚洲国产综合在线| 久久色在线观看| 99re成人精品视频| 久久久久久久久久电影| 91麻豆蜜桃一区二区三区| 亚洲一区二区欧美| 欧美不卡一二三| 国产不卡视频在线播放| 一区二区三区精品视频在线| 欧美一区二区三区四区久久 | 国产精品素人一区二区| 91麻豆精品国产自产在线观看一区 | 欧美日韩国产综合视频在线观看| 另类调教123区| 午夜精品aaa| 一区二区成人在线观看| ...av二区三区久久精品| 欧美激情一区二区三区全黄| 精品国产第一区二区三区观看体验 | 日韩理论片在线| 久久久久久一二三区| 日韩免费性生活视频播放| 久久久亚洲国产美女国产盗摄| 96av麻豆蜜桃一区二区| 日韩电影免费在线观看网站| 日韩一区二区在线播放| 91国内精品野花午夜精品| 色拍拍在线精品视频8848| 激情久久五月天| 日韩精品影音先锋| 免费在线观看一区二区三区| 日韩精品一区二| 懂色中文一区二区在线播放| 国产亚洲一区字幕| av网站一区二区三区| 亚洲黄色免费电影| 91精品国产手机| 国产精品一二三四五| 国产精品嫩草影院com| 在线观看亚洲专区| 免费观看一级特黄欧美大片| 久久精品免视看| 色哟哟国产精品| 五月综合激情网| 欧美精品一区二区高清在线观看 | 视频在线观看一区二区三区| 欧美成人伊人久久综合网| 国产精品一品二品| 一区二区三区自拍| 欧美tickle裸体挠脚心vk| 99久久精品情趣| 视频在线观看一区二区三区| 国产色综合一区| 欧美视频在线不卡| 国产精品888| 婷婷综合另类小说色区| www久久精品| 欧洲国产伦久久久久久久| 国产一区二区三区免费观看| 亚洲精品国产无套在线观| 日韩午夜在线播放| 91精品福利视频| 国产美女精品在线| 午夜欧美2019年伦理| 中文字幕在线观看一区二区| 欧美一区二区三区在线观看| 成人h版在线观看| 蜜桃免费网站一区二区三区| 亚洲激情图片小说视频| 国产无一区二区| 日韩欧美在线综合网| 欧美视频一区二区| 99久久精品国产导航| 国产精品一区二区三区四区 |