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

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

?? smb_ex2.c

?? c8051f020 i2c 源碼。對其操作有詳細描述。
?? C
字號:
//------------------------------------------------------------------------------------
//
// Copyright 2001 Cygnal Integrated Products, Inc.
//
// FILE NAME      : SMB_Ex2.c
// TARGET DEVICE  : C8051F000
// CREATED ON     : 2/20/01
// CREATED BY     : JS
//
//
// Example code for interfacing a C8051F0xx to three EEPROMs via the SMBus.
// Code assumes that three 16-bit address space EEPROMs are connected
// on the SCL and SDA lines, and configured so that their slave addresses
// are as follows:
// CHIP_A = 1010000
// CHIP_B = 1010001
// CHIP_C = 1010010
//
// Slave and arbitration states are not defined.  Assume the CF000 is the only
// master in the system.
// Functions: SM_Send performs a 1-byte write to the specified EEPROM
// SM_Receive performs a 1-byte read of the specified EEPROM address (both include
// memory address references).
//
// Includes test code section.

//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f000.h>              // SFR declarations

//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------

#define WRITE 0x00                  // SMBus WRITE command
#define READ  0x01                  // SMBus READ command

// Device addresses (7 bits, lsb is a don't care)
#define CHIP_A 0xA0                 // Device address for chip A
#define CHIP_B 0xA2                 // Device address for chip B
#define CHIP_C 0xA4                 // Device address for chip C

// SMBus states:
// MT = Master Transmitter
// MR = Master Receiver
#define  SMB_BUS_ERROR  0x00        // (all modes) BUS ERROR
#define  SMB_START      0x08        // (MT & MR) START transmitted
#define  SMB_RP_START   0x10        // (MT & MR) repeated START
#define  SMB_MTADDACK   0x18        // (MT) Slave address + W transmitted;
                                    //  ACK received
#define  SMB_MTADDNACK  0x20        // (MT) Slave address + W transmitted;
                                    //  NACK received
#define  SMB_MTDBACK    0x28        // (MT) data byte transmitted; ACK rec'vd
#define  SMB_MTDBNACK   0x30        // (MT) data byte transmitted; NACK rec'vd
#define  SMB_MTARBLOST  0x38        // (MT) arbitration lost
#define  SMB_MRADDACK   0x40        // (MR) Slave address + R transmitted;
                                    //  ACK received
#define  SMB_MRADDNACK  0x48        // (MR) Slave address + R transmitted;
                                    //  NACK received
#define  SMB_MRDBACK    0x50        // (MR) data byte rec'vd; ACK transmitted
#define  SMB_MRDBNACK   0x58        // (MR) data byte rec'vd; NACK transmitted


//-----------------------------------------------------------------------------------
//Global VARIABLES
//-----------------------------------------------------------------------------------
char COMMAND;                       // Holds the slave address + R/W bit for
                                    // use in the SMBus ISR.

char WORD;                          // Holds data to be transmitted by the SMBus
                                    // OR data that has just been received.

char BYTE_NUMBER;                   // Used by ISR to check what data has just been
                                    // sent - High address byte, Low byte, or data
                                    // byte

unsigned char HIGH_ADD, LOW_ADD;    // High & Low byte for EEPROM memory address

bit SM_BUSY;                        // This bit is set when a send or receive
                                    // is started. It is cleared by the
                                    // ISR when the operation is finished.


//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------

void SMBus_ISR (void);
void SM_Send (char chip_select, unsigned int byte_address, char out_byte);
char SM_Receive (char chip_select, unsigned int byte_address);

//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
//
// Main routine configures the crossbar and SMBus, and tests
// the SMBus interface between the three EEPROMs
void main (void)
{
   unsigned char check;             // Used for testing purposes

   WDTCN = 0xde;                    // disable watchdog timer
   WDTCN = 0xad;

   OSCICN |= 0x03;                  // Set internal oscillator to highest setting
                                    // (16 MHz)

   XBR0 = 0x01;                     // Route SMBus to GPIO pins through crossbar
   XBR2 = 0x40;                     // Enable crossbar and weak pull-ups

   SMB0CN = 0x44;                   // Enable SMBus with ACKs on acknowledge 
                                    // cycle
   SMB0CR = -80;                    // SMBus clock rate = 100kHz.

   EIE1 |= 2;                       // SMBus interrupt enable
   EA = 1;                          // Global interrupt enable

   SM_BUSY = 0;                     // Free SMBus for first transfer.


// TEST CODE---------------------------------------------------------------------
   SM_Send(CHIP_A, 0x0088, 0x53);      // Send 0x53(data) to address 0x88 on CHIP_A
   SM_Send(CHIP_B, 0x0001, 0x66);      // Send 0x66(data) to address 0x01 on CHIP_B
   SM_Send(CHIP_C, 0x0010, 0x77);
   SM_Send(CHIP_B, 0x0333, 0xF0);
   SM_Send(CHIP_A, 0x0242, 0xF0);

   check = SM_Receive(CHIP_A, 0x0088); // Read address 0x88 on CHIP_A
   check = SM_Receive(CHIP_B, 0x0001); // Read address 0x01 on CHIP_B
   check = SM_Receive(CHIP_C, 0x0010);
   check = SM_Receive(CHIP_B, 0x0333);
   check = SM_Receive(CHIP_A, 0x0242);
// END TEST CODE-----------------------------------------------------------------

}


// SMBus byte write function-----------------------------------------------------
// Writes a single byte at the specified memory location.
//
// out_byte = data byte to be written
// byte_address = memory location to be written into (2 bytes)
// chip_select = device address of EEPROM chip to be written to
void SM_Send (char chip_select, unsigned int byte_address, char out_byte)
{
   while (SM_BUSY);                          // Wait for SMBus to be free.
   SM_BUSY = 1;                              // Occupy SMBus (set to busy)
   SMB0CN = 0x44;                            // SMBus enabled,
                                             // ACK on acknowledge cycle

   BYTE_NUMBER = 2;                          // 2 address bytes.
   COMMAND = (chip_select | WRITE);          // Chip select + WRITE

   HIGH_ADD = ((byte_address >> 8) & 0x00FF);// Upper 8 address bits
   LOW_ADD = (byte_address & 0x00FF);        // Lower 8 address bits

   WORD = out_byte;                          // Data to be writen
   
   STO = 0;
   STA = 1;                                  // Start transfer

}

// SMBus random read function------------------------------------------------------
// Reads 1 byte from the specified memory location.
//
// byte_address = memory address of byte to read
// chip_select = device address of EEPROM to be read from
char SM_Receive (char chip_select, unsigned int byte_address)
{
   while (SM_BUSY);                          // Wait for bus to be free.
   SM_BUSY = 1;                              // Occupy SMBus (set to busy)
   SMB0CN = 0x44;                            // SMBus enabled, ACK on acknowledge cycle

   BYTE_NUMBER = 2;                          // 2 address bytes
   COMMAND = (chip_select | READ);           // Chip select + READ

   HIGH_ADD = ((byte_address >> 8) & 0x00FF);// Upper 8 address bits
   LOW_ADD = (byte_address & 0x00FF);        // Lower 8 address bits
   
   STO = 0;
   STA = 1;                                  // Start transfer
   while (SM_BUSY);                          // Wait for transfer to finish
   return WORD;
}


//------------------------------------------------------------------------------------
// Interrupt Service Routine
//------------------------------------------------------------------------------------


// SMBus interrupt service routine:

void SMBUS_ISR (void) interrupt 7
{
   switch (SMB0STA){                   // Status code for the SMBus (SMB0STA register)

      // Master Transmitter/Receiver: START condition transmitted.
      // The R/W bit of the COMMAND word sent after this state will
      // always be a zero (W) because for both read and write,
      // the memory address must be written first.
      case SMB_START:
         SMB0DAT = (COMMAND & 0xFE);   // Load address of the slave to be accessed.
         STA = 0;                      // Manually clear START bit
         break;

      // Master Transmitter/Receiver: Repeated START condition transmitted.
      // This state should only occur during a read, after the memory address has been
      // sent and acknowledged.
      case SMB_RP_START:
         SMB0DAT = COMMAND;            // COMMAND should hold slave address + R.
         STA = 0;
         break;

      // Master Transmitter: Slave address + WRITE transmitted.  ACK received.
      case SMB_MTADDACK:
         SMB0DAT = HIGH_ADD;           // Load high byte of memory address
                                       // to be written.
         break;

      // Master Transmitter: Slave address + WRITE transmitted.  NACK received.
      // The slave is not responding.  Send a STOP followed by a START to try again.
      case SMB_MTADDNACK:
         STO = 1;
         STA = 1;
         break;

      // Master Transmitter: Data byte transmitted.  ACK received.
      // This state is used in both READ and WRITE operations.  Check BYTE_NUMBER
      // for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
      // If LOW_ADD has been sent, check COMMAND for R/W value to determine 
      // next state.
      case SMB_MTDBACK:
         switch (BYTE_NUMBER){
            case 2:                    // If BYTE_NUMBER=2, only HIGH_ADD
               SMB0DAT = LOW_ADD;      // has been sent.
               BYTE_NUMBER--;          // Decrement for next time around.
               break;
            case 1:                    // If BYTE_NUMBER=1, LOW_ADD was just sent.
               if (COMMAND & 0x01){    // If R/W=READ, sent repeated START.
                  STO = 0;
                  STA = 1;

               } else { 
                  SMB0DAT = WORD;      // If R/W=WRITE, load byte to write.
                  BYTE_NUMBER--;
               }
               break;
            default:                   // If BYTE_NUMBER=0, transfer is finished.
               STO = 1;
               SM_BUSY = 0;            // Free SMBus
            }
         break;


      // Master Transmitter: Data byte transmitted.  NACK received.
      // Slave not responding.  Send STOP followed by START to try again.
      case SMB_MTDBNACK:
         STO = 1;
         STA = 1;
         break;

      // Master Transmitter: Arbitration lost.
      // Should not occur.  If so, restart transfer.
      case SMB_MTARBLOST:
         STO = 1;
         STA = 1;
         break;

      // Master Receiver: Slave address + READ transmitted.  ACK received.
      // Set to transmit NACK after next transfer since it will be the last (only)
      // byte.
      case SMB_MRADDACK:
         AA = 0;                       // NACK sent on acknowledge cycle.
         break;

      // Master Receiver: Slave address + READ transmitted.  NACK received.
      // Slave not responding.  Send repeated start to try again.
      case SMB_MRADDNACK:
         STO = 0;
         STA = 1;
         break;

      // Data byte received.  ACK transmitted.
      // State should not occur because AA is set to zero in previous state.
      // Send STOP if state does occur.
      case SMB_MRDBACK:
         STO = 1;
         SM_BUSY = 0;
         break;

      // Data byte received.  NACK transmitted.
      // Read operation has completed.  Read data register and send STOP.
      case SMB_MRDBNACK:
         WORD = SMB0DAT;
         STO = 1;
         SM_BUSY = 0;                  // Free SMBus
         break;

      // All other status codes meaningless in this application. Reset communication.
      default:
         STO = 1;                      // Reset communication.
         SM_BUSY = 0;
         break;
      }

   SI=0;                               // clear interrupt flag
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合免费观看高清完整版| 日韩精品电影在线观看| 男女激情视频一区| 欧美日韩高清一区| 夜夜嗨av一区二区三区四季av | 亚洲婷婷国产精品电影人久久| 欧美色涩在线第一页| 久久夜色精品一区| 日韩高清一区二区| 在线成人av影院| 亚洲chinese男男1069| 日本福利一区二区| 亚洲亚洲精品在线观看| 色综合视频一区二区三区高清| 国产精品电影一区二区| 色综合天天在线| 亚洲欧美国产毛片在线| jlzzjlzz亚洲日本少妇| 亚洲视频香蕉人妖| 99久久精品99国产精品| 亚洲一二三四区不卡| 3atv一区二区三区| 国产伦精品一区二区三区免费| 精品久久久久久久人人人人传媒| 国内精品伊人久久久久av影院| 久久精品人人做人人爽人人| 国产精品综合一区二区| 国产精品久久久久久久久免费丝袜 | 国产成人精品一区二| 亚洲欧洲成人精品av97| 欧美日韩亚洲综合在线 | 亚洲国产精品久久不卡毛片| 7777精品伊人久久久大香线蕉的 | 国产成人精品免费一区二区| 亚洲日本欧美天堂| 91麻豆精品国产91久久久久久久久 | 日韩欧美亚洲国产精品字幕久久久| 免费久久精品视频| 久久影音资源网| 亚洲精品一二三| 盗摄精品av一区二区三区| 亚洲乱码国产乱码精品精98午夜 | 日本欧美肥老太交大片| 国产精品美女久久久久久久久| 精品久久久久久综合日本欧美| 亚洲尤物视频在线| 日韩欧美卡一卡二| 色偷偷88欧美精品久久久| 亚洲午夜激情网站| 亚洲视频电影在线| 日本一区二区三区免费乱视频| 成人精品视频一区二区三区| 中文字幕一区二区三区在线播放| 日韩视频免费观看高清完整版| 一本久久a久久免费精品不卡| 极品少妇一区二区三区精品视频 | 欧美日韩精品专区| 99久久综合国产精品| 国产精品一区一区| 石原莉奈在线亚洲三区| 亚洲国产另类av| 婷婷国产在线综合| 欧美三级在线视频| 国产一本一道久久香蕉| 免费在线观看视频一区| 日韩电影在线观看网站| 蜜桃av一区二区三区电影| 午夜天堂影视香蕉久久| 久久精品国产亚洲aⅴ| 夜色激情一区二区| 香港成人在线视频| 久久精品999| 99久久精品免费| 欧美三级日韩三级国产三级| 在线观看91精品国产麻豆| 欧美精品 国产精品| 日韩三级免费观看| 国产欧美日韩精品一区| 亚洲欧洲精品一区二区三区| 一区二区三区自拍| 日本成人中文字幕在线视频 | 欧美激情在线一区二区三区| 国产精品灌醉下药二区| 亚洲一区电影777| 国产剧情一区在线| 欧美精品1区2区3区| 欧美经典三级视频一区二区三区| 日韩一区和二区| 国产精品久久综合| 男男gaygay亚洲| 91亚洲国产成人精品一区二区三| 日韩欧美亚洲另类制服综合在线| 国产精品青草综合久久久久99| 日本不卡一区二区三区| 99在线热播精品免费| 日韩一区二区三区在线| 国产精品区一区二区三区| 免费美女久久99| 在线一区二区三区四区| 日本一区二区三区免费乱视频| 日韩精品福利网| 日韩亚洲欧美中文三级| 1024国产精品| 99久久精品免费精品国产| 国产精品婷婷午夜在线观看| 精品亚洲国产成人av制服丝袜| 欧美一级黄色录像| 亚洲狠狠爱一区二区三区| 99视频精品全部免费在线| 国产精品五月天| 99视频超级精品| 综合久久国产九一剧情麻豆| 99久久综合精品| 日韩美女视频一区二区| 色吊一区二区三区| 天天做天天摸天天爽国产一区| 91精品国产综合久久久久| 日产欧产美韩系列久久99| 在线观看视频91| 美女视频网站久久| 亚洲欧洲日产国产综合网| 欧美三级蜜桃2在线观看| 日韩av一区二区在线影视| 精品毛片乱码1区2区3区| 99久久婷婷国产综合精品| 亚洲精品国产一区二区精华液 | 亚洲精品国产无套在线观| 欧美性高清videossexo| 麻豆精品视频在线观看免费| 国产午夜亚洲精品理论片色戒 | 成人免费毛片高清视频| 亚洲一区免费视频| 国产精品久久久久aaaa| 欧美日韩不卡视频| 风间由美性色一区二区三区| 一区二区成人在线视频| 欧美xxxxxxxx| 欧美性色aⅴ视频一区日韩精品| 国产不卡视频一区二区三区| 亚洲综合激情小说| 亚洲欧洲国产日韩| 欧美成人高清电影在线| 亚洲亚洲精品在线观看| 在线播放中文一区| 99国产精品视频免费观看| 五月激情六月综合| 亚洲少妇30p| 亚洲欧美精品午睡沙发| 26uuu另类欧美| 日韩午夜精品视频| 欧美在线观看你懂的| 色妹子一区二区| av福利精品导航| 成人av免费在线播放| 国产精品夜夜嗨| 国产在线视频精品一区| 国产一区二区在线观看免费 | 国产日产亚洲精品系列| 精品国产成人系列| 国产欧美综合在线| 国产精品福利一区二区| 伊人夜夜躁av伊人久久| 亚洲综合在线电影| 香蕉成人伊视频在线观看| 亚洲高清免费观看高清完整版在线观看 | 日韩专区一卡二卡| 久久超碰97中文字幕| 国产91对白在线观看九色| 成人午夜电影久久影院| 91激情五月电影| 欧美一区二区视频免费观看| 精品福利一区二区三区| 国产日韩av一区二区| 亚洲一区二区三区激情| 加勒比av一区二区| 色婷婷激情综合| 日韩美女视频一区二区在线观看| 国产精品妹子av| 视频在线在亚洲| 97精品视频在线观看自产线路二| 欧美三片在线视频观看| 中文乱码免费一区二区| 视频在线观看91| av不卡在线播放| 久久天天做天天爱综合色| 午夜精品福利在线| 国产精品自产自拍| 精品国产伦一区二区三区观看方式| 亚洲欧美日韩久久精品| 丁香六月久久综合狠狠色| 日韩视频中午一区| 亚洲国产精品久久久久秋霞影院| 成人一道本在线| 欧美一区二区三区免费视频| 亚洲成人先锋电影| 91偷拍与自偷拍精品| 国产精品视频yy9299一区| 久久精品99国产精品日本| 91精品国产日韩91久久久久久| 中文字幕亚洲在|