日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]UART、 I2C 和 SPI 是單片機系統(tǒng)中最常用的三種通信協(xié)議。

UART、 I2C 和 SPI 是單片機系統(tǒng)中最常用的三種通信協(xié)議。

1、初步介紹

SPI 是一種高速的、全雙工、同步通信總線,標準的 SPI 也僅僅使用 4 個引腳,常用于單片機和 EEPROM、FLASH、實時時鐘、數(shù)字信號處理器等器件的通信。 SPI 通信原理比 I2C要簡單,它主要是主從方式通信,這種模式通常只有一個主機和一個或者多個從機,標準的 SPI 是 4 根線,分別是 SSEL( 片選,也寫作 SCS)、 SCLK( 時鐘,也寫作 SCK)、 MOSI( 主機輸出從機輸入Master Output/Slave Input) 和 MISO( 主機輸入從機輸出 Master Input/Slave Output)。

SSEL:從設備片選使能信號。如果從設備是低電平使能的話,當拉低這個引腳后,從設備就會被選中,主機和這個被選中的從機進行通信。

SCLK:時鐘信號,由主機產(chǎn)生,和 I2C通信的 SCL 有點類似。

MOSI:主機給從機發(fā)送指令或者數(shù)據(jù)的通道。

MISO:主機讀取從機的狀態(tài)或者數(shù)據(jù)的通道。

2、工作模式

SPI 通信的主機也是我們的單片機,在讀寫數(shù)據(jù)時序的過程中,有四種模式;

CPOL:Clock Polarity,就是時鐘的極性。通信的整個過程分為空閑時刻和通信時刻, 如果 SCLK 在數(shù)據(jù)發(fā)送之前和之后的空閑狀態(tài)是高電平, 那么就是CPOL=1,如果空閑狀態(tài)SCLK 是低電平,那么就是 CPOL=0。

CPHA: Clock Phase,就是時鐘的相位。

#include

typedef unsigned char uchar;

sbit DS1302_CE = P1 ^ 7;

sbit DS1302_CK = P3 ^ 5;

sbit DS1302_IO = P3 ^ 4;

struct sTime //日期時間結構體定義

{

unsigned int year; //年

unsigned char mon; //月

unsigned char day; //日

unsigned char hour; //時

unsigned char min; //分

unsigned char sec; //秒

unsigned char week; //星期

};

/* 發(fā)送一個字節(jié)到DS1302通信總線上*/

void DS1302ByteWrite(uchar dat)

{

uchar mask;

for (mask = 0x01; mask != 0; mask <<= 1) //低位在前,逐位移出

{

if ((mask & dat) != 0) //首先輸出該位數(shù)據(jù)

{

DS1302_IO = 1;

}

else

{

DS1302_IO = 0;

}

DS1302_CK = 1; //然后拉高時鐘

DS1302_CK = 0; //再拉低時鐘,完成一個位的操作

}

DS1302_IO = 1; //最后確保釋放IO引腳

}

/* 由DS1302通信總線上讀取一個字節(jié)*/

uchar DS1302ByteRead()

{

uchar mask;

uchar dat = 0;

for (mask = 0x01; mask != 0; mask <<= 1) //低位在前,逐位讀取

{

if (DS1302_IO != 0) //首先讀取此時的IO引腳,并設置dat中的對應位

{

dat |= mask;

}

DS1302_CK = 1; //然后拉高時鐘

DS1302_CK = 0; //再拉低時鐘,完成一個位的操作

}

return dat; //最后返回讀到的字節(jié)數(shù)據(jù)

}

/* 用單次寫操作向某一寄存器寫入一個字節(jié),reg-寄存器地址,dat-待寫入字節(jié)*/

void DS1302SingleWrite(uchar reg, uchar dat)

{

DS1302_CE = 1; //使能片選信號

DS1302ByteWrite((reg << 1) | 0x80); //發(fā)送寫寄存器指令

DS1302ByteWrite(dat); //寫入字節(jié)數(shù)據(jù)

DS1302_CE = 0; //除能片選信號

}

/* 用單次讀操作從某一寄存器讀取一個字節(jié),reg-寄存器地址,返回值-讀到的字節(jié)*/

uchar DS1302SingleRead(uchar reg)

{

uchar dat;

DS1302_CE = 1; //使能片選信號

DS1302ByteWrite((reg << 1) | 0x81); //發(fā)送讀寄存器指令

dat = DS1302ByteRead(); //讀取字節(jié)數(shù)據(jù)

DS1302_CE = 0; //除能片選信號

return dat;

}

/* 用突發(fā)模式連續(xù)寫入8個寄存器數(shù)據(jù),dat-待寫入數(shù)據(jù)指針*/

void DS1302BurstWrite(uchar *dat)

{

uchar i;

DS1302_CE = 1;

DS1302ByteWrite(0xBE); //發(fā)送突發(fā)寫寄存器指令

for (i = 0; i < 8; i++) //連續(xù)寫入8字節(jié)數(shù)據(jù)

{

DS1302ByteWrite(dat[i]);

}

DS1302_CE = 0;

}

/* 用突發(fā)模式連續(xù)讀取8個寄存器的數(shù)據(jù),dat-讀取數(shù)據(jù)的接收指針*/

void DS1302BurstRead(uchar *dat)

{

uchar i;

DS1302_CE = 1;

DS1302ByteWrite(0xBF); //發(fā)送突發(fā)讀寄存器指令

for (i = 0; i < 8; i++) //連續(xù)讀取8個字節(jié)

{

dat[i] = DS1302ByteRead();

}

DS1302_CE = 0;

}

/* 獲取實時時間,即讀取DS1302當前時間并轉換為時間結構體格式*/

void GetRealTime(struct sTime *time)

{

uchar buf[8];

DS1302BurstRead(buf);

time->year = buf[6] + 0x2000;

time->mon = buf[4];

time->day = buf[3];

time->hour = buf[2];

time->min = buf[1];

time->sec = buf[0];

time->week = buf[5];

}

/* 設定實時時間,時間結構體格式的設定時間轉換為數(shù)組并寫入DS1302*/

void SetRealTime(struct sTime *time)

{

uchar buf[8];

buf[7] = 0;

buf[6] = time->year;

buf[5] = time->week;

buf[4] = time->mon;

buf[3] = time->day;

buf[2] = time->hour;

buf[1] = time->min;

buf[0] = time->sec;

DS1302BurstWrite(buf);

}

/* DS1302初始化,如發(fā)生掉電則重新設置初始時間*/

void InitDS1302()

{

uchar dat;

struct sTime code InitTime[] = //2016年5月18日9:00:00 星期二

{

0x2016, 0x05, 0x18, 0x09, 0x00, 0x00, 0x02

};

DS1302_CE = 0; //初始化DS1302通信引腳

DS1302_CK = 0;

dat = DS1302SingleRead(0); //讀取秒寄存器

if ((dat & 0x80) != 0) //由秒寄存器最高位CH的值判斷DS1302是否已停止

{

DS1302SingleWrite(7, 0x00); //撤銷寫保護以允許寫入數(shù)據(jù)

SetRealTime(&InitTime); //設置DS1302為默認的初始時間

}

}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉