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

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

?? spi_ee_f30x.c

?? spi協議的驅動程序源代碼
?? C
字號:
//-----------------------------------------------------------------------------
// SPI_EE_F30x.c
//-----------------------------------------------------------------------------
// Copyright 2001 Cygnal Integrated Products, Inc.
//
// AUTH: BD
// DATE: 14 DEC 01
//
// This program demonstrates how a collection of SPI master routines for the
// 8051F30x devices can be used in a C program.
//
// In this example, a Microchip 25LC320 4k X 8 Serial EEPROM is interfaced to a
// SPI master device implemented in the C8051F30x. The EEPROM is written with
// two test patterns: 1) all locations are 0xFF and 2) each location is written
// with the LSB of the corresponding address.
// The EEPROM contents are then verified with the test patterns. If the test
// patterns are verified with no errors, the LED blinks on operation completion.
// Otherwise, the LED stays off. Progress can also be monitored by a terminal
// connected to UART0 operating at 115.2kbps.
//
// For this code to be functional, *one* of the following files should also be
// compiled or assembled, and the resulting object file must be linked to the
// object file produced from this code:
//
// SPI_MODE0.c Mode 0 SPI Master Implementation in C
// SPI_MODE0.asm Mode 0 SPI Master Implementation in Assembly
// SPI_MODE3.c Mode 3 SPI Master Implementation in C
// SPI_MODE3.asm Mode 3 SPI Master Implementation in Assembly
//
// This EEPROM’s serial port will only operate with a Mode 0 or Mode 3
// SPI configuration.
//
// Target: C8051F30x
// Tool chain: KEIL C51 6.03 / KEIL EVAL C51
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f300.h> // SFR declarations
#include <stdio.h> // Standard I/O
#include “SPI_defs.h” // SPI port definitions
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for ‘F30x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
sfr16 PCA0CP1 = 0xe9; // PCA0 Module 1 Capture/Compare
sfr16 PCA0CP2 = 0xeb; // PCA0 Module 2 Capture/Compare
sfr16 PCA0 = 0xf9; // PCA0 counter
sfr16 PCA0CP0 = 0xfb; // PCA0 Module 0 Capture/Compare
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // SYSCLK frequency in Hz
#define BAUDRATE 115200 // Baud rate of UART in bps
#define EE_SIZE 4096 // EEPROM size in bytes
#define EE_READ 0x03 // EEPROM Read command
#define EE_WRITE 0x02 // EEPROM Write command
#define EE_WRDI 0x04 // EEPROM Write disable command
#define EE_WREN 0x06 // EEPROM Write enable command
#define EE_RDSR 0x05 // EEPROM Read status register
#define EE_WRSR 0x01 // EEPROM Write status register
sbit LED = P0^6; // LED Indicator
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void PORT_Init (void); // Port I/O configuration
void SYSCLK_Init (void); // SYSCLK Initialization
void UART0_Init (void); // UART0 Initialization
extern char SPI_Transfer (char); // SPI Transfer routine
void Timer0_ms (unsigned ms);
void Timer0_us (unsigned us);
unsigned char EE_Read (unsigned Addr);
void EE_Write (unsigned Addr, unsigned char value);
//-----------------------------------------------------------------------------
// Global VARIABLES
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
unsigned EE_Addr; // address of EEPROM byte
unsigned char test_byte;
// Disable Watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
SYSCLK_Init (); // initialize oscillator
PORT_Init (); // initialize ports and GPIO
UART0_Init (); // initialize UART0
EA = 1; // enable global interrupts
SCK = 0;
// fill EEPROM with 0xFF’s
LED = 1;
for (EE_Addr = 0; EE_Addr < EE_SIZE; EE_Addr++)
{
test_byte = 0xff;
EE_Write (EE_Addr, test_byte);
// print status to UART0
if ((EE_Addr % 16) == 0)
{
printf (“\nwriting 0x%04x: %02x “, EE_Addr, (unsigned) test_byte);
}
else
{
printf (“%02x “, (unsigned) test_byte);
}
}
// verify EEPROM with 0xFF’s
LED = 0;
for (EE_Addr = 0; EE_Addr < EE_SIZE; EE_Addr++)
{
test_byte = EE_Read (EE_Addr);
// print status to UART0
if ((EE_Addr % 16) == 0)
{
printf (“\nverifying 0x%04x: %02x “, EE_Addr, (unsigned) test_byte);
}
else
{
printf (“%02x “, (unsigned) test_byte);
}
if (test_byte != 0xFF)
{
printf (“Error at %u\n”, EE_Addr);
while (1); // stop here on error
}
}
LED = 1;
for (EE_Addr = 0; EE_Addr < EE_SIZE; EE_Addr++)
{
test_byte = EE_Addr & 0xff;
EE_Write (EE_Addr, test_byte);
// print status to UART0
if ((EE_Addr % 16) == 0)
{
printf (“\nwriting 0x%04x: %02x “, EE_Addr, (unsigned) test_byte);
}
else
{
printf (“%02x “, (unsigned) test_byte);
}
}
// verify EEPROM memory with LSB of EEPROM address
LED = 0;
for (EE_Addr = 0; EE_Addr < EE_SIZE; EE_Addr++)
{
test_byte = EE_Read (EE_Addr);
// print status to UART0
if ((EE_Addr % 16) == 0)
{
printf (“\nverifying 0x%04x: %02x “, EE_Addr, (unsigned) test_byte);
}
else
{
printf (“%02x “, (unsigned) test_byte);
}
if (test_byte != (EE_Addr & 0xFF))
{
printf (“Error at %u\n”, EE_Addr);
while (1); // stop here on error
}
}
while (1)
{ // Flash LED when done
Timer0_ms (100);
LED = ~LED;
}
}
//-----------------------------------------------------------------------------
// Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
// P0.0 - MOSI (push-pull)
// P0.1 - MISO
// P0.2 - SCK (push-pull)
// P0.3 - NSS (push-pull)
// P0.4 - UART TX (push-pull)
// P0.5 - UART RX
// P0.6 - LED
// P0.7 -
//
void PORT_Init (void)
{
XBR0 = 0x0F; // skip SPI pins in XBAR
XBR1 = 0x03; // UART0 TX and RX pins enabled
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x5D; // enable TX0, MOSI, SCK, LED and NSS as
// push-pull outputs
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5 MHz clock
// as its clock source.
//
void SYSCLK_Init (void)
{
OSCICN = 0x07; // select internal oscillator as SYSCLK
// source
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1)
{
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x13;
CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
}
else if (SYSCLK/BAUDRATE/2/256 < 4)
{
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x13;
CKCON |= 0x01; // T1M = 0; SCA1:0 = 01
}
else if (SYSCLK/BAUDRATE/2/256 < 12)
{
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00
}
else
{
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x13;
CKCON |= 0x02; // T1M = 0; SCA1:0 = 10
}
TL1 = 0xff; // set Timer1 to overflow immediately
TMOD |= 0x20; // TMOD: timer 1 in 8-bit autoreload
TMOD &= ~0xD0; // mode
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// Timer0_ms
//-----------------------------------------------------------------------------
//
// Configure Timer0 to delay <ms> milliseconds before returning.
//
void Timer0_ms (unsigned ms)
{
unsigned i; // millisecond counter
TCON &= ~0x30; // STOP Timer0 and clear overflow flag
TMOD &= ~0x0f; // configure Timer0 to 16-bit mode
TMOD |= 0x01;
CKCON |= 0x08; // Timer0 counts SYSCLKs
for (i = 0; i < ms; i++) // count milliseconds
{
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
}
}
//-----------------------------------------------------------------------------
// Timer0_us
//-----------------------------------------------------------------------------
//
// Configure Timer0 to delay <us> microseconds before returning.
//
void Timer0_us (unsigned us)
{
unsigned i; // millisecond counter
TCON &= ~0x30; // STOP Timer0 and clear overflow flag
TMOD &= ~0x0f; // configure Timer0 to 16-bit mode
TMOD |= 0x01;
CKCON |= 0x08; // Timer0 counts SYSCLKs
for (i = 0; i < us; i++) { // count microseconds
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000000) >> 8; // set Timer0 to overflow in 1us
TL0 = -SYSCLK/1000000;
TR0 = 1; // START Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
}
}
//-----------------------------------------------------------------------------
// EE_Read
//-----------------------------------------------------------------------------
//
// This routine reads and returns a single EEPROM byte whose address is
// given in <Addr>.
//
unsigned char EE_Read (unsigned Addr)
{
unsigned char retval; // value to return
NSS = 0; // select EEPROM
Timer0_us (1); // wait at least 250ns (CS setup time)
// transmit READ opcode
retval = SPI_Transfer(EE_READ);
// transmit Address MSB-first
retval = SPI_Transfer((Addr & 0xFF00) >> 8); // transmit MSB of address
retval = SPI_Transfer((Addr & 0x00FF)); // transmit LSB of address
// initiate dummy transmit to read data
retval = SPI_Transfer(0x00);
Timer0_us (1); // wait at least 250ns (CS hold time)
NSS = 1; // de-select EEPROM
Timer0_us (1); // wait at least 500ns (CS disable time)
return retval;
}
//-----------------------------------------------------------------------------
// EE_Write
//-----------------------------------------------------------------------------
//
// This routine writes a single EEPROM byte <value> to address <Addr>.
//
void EE_Write (unsigned Addr, unsigned char value)
{
unsigned char retval; // return value from SPI
NSS = 0; // select EEPROM
Timer0_us (1); // wait at least 250ns (CS setup time)
// transmit WREN (Write Enable) opcode
retval = SPI_Transfer(EE_WREN);
Timer0_us (1); // wait at least 250ns (CS hold time)
NSS = 1; // de-select EEPROM to set WREN latch
Timer0_us (1); // wait at least 500ns (CS disable
// time)
NSS = 0; // select EEPROM
Timer0_us (1); // wait at least 250ns (CS setup time)
// transmit WRITE opcode
retval = SPI_Transfer(EE_WRITE);
// transmit Address MSB-first
retval = SPI_Transfer((Addr & 0xFF00) >> 8); // transmit MSB of address
retval = SPI_Transfer((Addr & 0x00FF)); // transmit LSB of address
// transmit data
retval = SPI_Transfer(value);
Timer0_us (1); // wait at least 250ns (CS hold time)
NSS = 1; // deselect EEPROM (initiate EEPROM
// write cycle)
// now poll Read Status Register (RDSR) for Write operation complete
do {
Timer0_us (1); // wait at least 500ns (CS disable
// time)
NSS = 0; // select EEPROM to begin polling
Timer0_us (1); // wait at least 250ns (CS setup time)
retval = SPI_Transfer(EE_RDSR);
retval = SPI_Transfer(0x00);
Timer0_us (1); // wait at least 250ns (CS hold
// time)
NSS = 1; // de-select EEPROM
} while (retval & 0x01); // poll until WIP (Write In
// Progress) bit goes to ‘0’
Timer0_us (1); // wait at least 500ns (CS disable
// time)
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品ⅴa在线观看| 99精品视频在线播放观看| 欧美精品一二三| 亚洲制服丝袜av| 欧美无砖砖区免费| 男女男精品网站| 国产拍欧美日韩视频二区| 成人av资源在线| 夜夜揉揉日日人人青青一国产精品 | 国产成人综合视频| 国产亚洲精品资源在线26u| 国产69精品久久777的优势| 亚洲三级视频在线观看| 欧美日韩视频专区在线播放| 蜜桃久久久久久| 欧美激情中文字幕| 在线看不卡av| 另类调教123区| |精品福利一区二区三区| 欧美日韩在线播放三区| 久久se精品一区二区| 国产精品国产自产拍高清av王其| 在线精品视频一区二区三四 | 亚洲欧美成aⅴ人在线观看| 91麻豆免费看| 蜜桃av一区二区在线观看| 国产精品美女一区二区在线观看| 欧美在线一区二区三区| 国产一区二区在线观看视频| 亚洲美女视频在线观看| 欧美一卡二卡三卡| 9色porny自拍视频一区二区| 日韩精品视频网站| 亚洲女与黑人做爰| 精品对白一区国产伦| 91福利资源站| 国产91精品一区二区麻豆网站| 亚洲成人免费在线观看| 国产午夜亚洲精品理论片色戒| 在线精品视频免费播放| 国产精品一区二区黑丝| 亚洲国产日韩a在线播放性色| 久久这里只精品最新地址| 91浏览器打开| 国产精品一级片在线观看| 亚洲国产美国国产综合一区二区| 久久精品免视看| 日韩精品一区二区三区在线观看| 色老头久久综合| 成人av午夜电影| 国内精品视频666| 日韩二区三区在线观看| 亚洲一区二区偷拍精品| 136国产福利精品导航| 精品精品国产高清a毛片牛牛 | 亚洲成人av一区二区三区| 久久精品水蜜桃av综合天堂| 91精品国产综合久久精品麻豆| 91视视频在线直接观看在线看网页在线看| 捆绑调教美女网站视频一区| 婷婷丁香激情综合| 亚洲国产色一区| 亚洲综合激情小说| 亚洲精品欧美在线| 亚洲天堂网中文字| 日韩码欧中文字| 中文字幕一区二区三区视频| 国产亚洲欧美色| 久久久久国色av免费看影院| 日韩美女视频在线| 日韩色视频在线观看| 日韩一区二区三区电影| 91精品福利在线一区二区三区 | 欧美一区二区二区| 3d成人h动漫网站入口| 欧美人伦禁忌dvd放荡欲情| 在线视频国内自拍亚洲视频| 色偷偷成人一区二区三区91| 99re成人精品视频| 91国偷自产一区二区开放时间 | 高潮精品一区videoshd| 国产99久久久国产精品免费看 | 91老师国产黑色丝袜在线| 91在线精品一区二区| 一本色道久久综合狠狠躁的推荐| 色先锋资源久久综合| 在线中文字幕不卡| 欧美一区二区在线不卡| 日韩女优电影在线观看| 26uuuu精品一区二区| 久久久久久久综合| 国产精品久久免费看| 亚洲乱码国产乱码精品精小说 | 制服视频三区第一页精品| 5月丁香婷婷综合| 欧美电视剧在线看免费| 久久久综合视频| 中文字幕一区二区三中文字幕| 亚洲男人的天堂在线aⅴ视频| 亚洲成人免费在线| 国产一区欧美日韩| eeuss鲁一区二区三区| 欧美性一二三区| 欧美mv日韩mv| 亚洲欧美日韩人成在线播放| 五月婷婷欧美视频| 国产一区二区福利| 在线观看欧美日本| 久久亚洲春色中文字幕久久久| 一区在线播放视频| 午夜电影网亚洲视频| 韩国女主播成人在线观看| caoporn国产一区二区| 欧美男生操女生| 国产欧美一区二区在线| 亚洲一卡二卡三卡四卡五卡| 国精产品一区一区三区mba视频 | 欧美丝袜第三区| 久久色.com| 亚洲一区二区偷拍精品| 国产福利一区二区三区视频| 91高清视频在线| 日本一二三四高清不卡| 亚洲v中文字幕| 成人免费毛片a| 制服.丝袜.亚洲.中文.综合| 国产精品护士白丝一区av| 老司机精品视频在线| 色狠狠一区二区三区香蕉| 久久综合色之久久综合| 亚洲小少妇裸体bbw| 成人精品免费网站| 精品剧情v国产在线观看在线| 亚洲美女屁股眼交| 国产激情一区二区三区四区| 欧美美女一区二区在线观看| 1区2区3区精品视频| 国产一区二区三区蝌蚪| 欧美一区二区三级| 夜夜精品视频一区二区| 成人av网址在线观看| 久久综合给合久久狠狠狠97色69| 天堂va蜜桃一区二区三区漫画版| av激情成人网| 中文字幕乱码久久午夜不卡| 激情综合五月天| 日韩一级免费观看| 午夜欧美视频在线观看| 色综合久久中文综合久久牛| 中文字幕国产一区| 国产一区二区三区免费观看| 日韩你懂的在线播放| 亚洲一级片在线观看| 91麻豆国产精品久久| 中文字幕在线播放不卡一区| 国产在线国偷精品免费看| 日韩一级在线观看| 久久精品国产第一区二区三区| 欧美三级日韩三级国产三级| 亚洲中国最大av网站| 91福利在线免费观看| 一区二区三区中文在线观看| 色综合天天性综合| 亚洲人成网站影音先锋播放| 一本色道久久综合狠狠躁的推荐| 日韩一区在线播放| 色综合久久88色综合天天免费| 亚洲图片你懂的| 91丝袜国产在线播放| 亚洲另类一区二区| 日本久久精品电影| 亚洲狠狠爱一区二区三区| 精品视频色一区| 图片区小说区区亚洲影院| 91精品国产综合久久国产大片| 日韩av一区二区三区| 日韩欧美专区在线| 精品在线播放午夜| 久久精品一区二区三区四区| 福利一区二区在线观看| 一区在线观看免费| 欧美日韩日日夜夜| 青娱乐精品在线视频| 久久久99精品久久| 91同城在线观看| 日韩专区欧美专区| 久久天堂av综合合色蜜桃网| www.日韩大片| 亚洲高清久久久| 精品成人一区二区三区| 丰满白嫩尤物一区二区| 一区二区三区在线观看网站| 7777精品伊人久久久大香线蕉经典版下载| 偷拍亚洲欧洲综合| 久久综合色8888| 一本到一区二区三区| 蜜臀av亚洲一区中文字幕| 国产亚洲1区2区3区| 欧美午夜在线观看| 国产在线国偷精品产拍免费yy|