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

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 在學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)一點(diǎn)容易被忽視而又很?chē)?yán)重的問(wèn)題---那就是關(guān)于SSP1的引腳使用P0[7]-P0[8]-P0[9]時(shí),是W型IO配置。寄存器的第7位很容易被我們?cè)O(shè)置為0--但是手冊(cè)上是要求必須為1,否則不能正常工作,這

在學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)一點(diǎn)容易被忽視而又很?chē)?yán)重的問(wèn)題---那就是關(guān)于SSP1的引腳使用P0[7]-P0[8]-P0[9]時(shí),是W型IO配置。寄存器的第7位很容易被我們?cè)O(shè)置為0--但是手冊(cè)上是要求必須為1,否則不能正常工作,這里我走了一點(diǎn)彎路。



#include"ssp_lpc1788.h"


#define SPI_FLASH_PageSize 256 //頁(yè)大小
#define SPI_FLASH_PerWritePageSize 256 //寫(xiě)頁(yè)大小


/*----------------初始化SSP0-------------*/
void SSP0_Init(unsigned long sysClk, unsigned spiClk)
{
volatile uint32_t dummy;

dummy = dummy;

LPC_IOCON->P2_22 =0x22; // SSP0_SCK
LPC_IOCON->P2_26 =0x22; // SSP0_MISO
LPC_IOCON->P2_27 =0x22; // SSP0_MOSI

LPC_IOCON->P2_23=0x30; //SSP1_CS-直接普通上拉IO
LPC_GPIO2->DIR "= (1UL << 23); //輸出
LPC_GPIO2->SET|=(1<<23);//置一

LPC_SC->PCONP |= (1UL << 21); //SSP0 時(shí)鐘開(kāi)啟

LPC_SSP0->CR0 = 0x0007; // 8Bit, CPOL=0, CPHA=0
LPC_SSP0->CR1 = 0x0002; // SSP0-使能-主模式

LPC_SSP0->CPSR = sysClk/spiClk; //時(shí)鐘預(yù)分頻寄存器

while( LPC_SSP0->SR & ( 1 << 4 ) ); //忙

while( LPC_SSP0->SR & ( 1 << 2 ) ) //接收FIFO不為空
{
dummy = LPC_SSP0->DR; //假讀取去清空FIFO
}

}

/*-------------SSP0-發(fā)送數(shù)據(jù)-----------------*/
void SSP0_WriteByte(unsigned char data)
{
uint8_t Dummy;

LPC_SSP0->DR = data; //載入要發(fā)送的數(shù)據(jù)
while (LPC_SSP0->SR & (1 << 4)){}//等待發(fā)送完成
Dummy=LPC_SSP0->DR; //假讀取去清空FIFO
}

/*-------------SSP0-接收數(shù)據(jù)-----------------*/
uint8_t SSP0_RegisterByte(void)
{
LPC_SSP0->DR = 0xFF; //無(wú)效指令
while (LPC_SSP0->SR & (1 << 4)){}//忙等待

return (LPC_SSP0->DR); //接收數(shù)據(jù)
}


/*-----------------------------------SSP1--------------------------*/
/*----------------初始化SSP1-------------*/
void SSP1_Init(unsigned long sysClk, unsigned spiClk)
{
volatile uint32_t dummy;


LPC_IOCON->P0_7 =0xA2; // SSP1_SCK
LPC_IOCON->P0_8 =0xA2; // SSP1_MISO
LPC_IOCON->P0_9 =0xA2; // SSP1_MOSI

LPC_IOCON->P0_6=0x30; //SSP1_CS-普通上拉IO
LPC_GPIO0->DIR |= (1UL << 6); //輸出
LPC_GPIO0->SET|=(1<<6);//置一

LPC_SC->PCONP |= (1UL << 10); //SSP1 時(shí)鐘開(kāi)啟

LPC_SSP1->CR0 = 0x0007; // 8Bit, CPOL=0, CPHA=0
LPC_SSP1->CR1 = 0x0002; // SSP1-使能-主模式

LPC_SSP1->CPSR = sysClk/spiClk; //時(shí)鐘預(yù)分頻寄存器

while( LPC_SSP1->SR & ( 1 << 4 ) ); //忙

while( LPC_SSP1->SR & ( 1 << 2 ) ) //接收FIFO不為空
{
dummy = LPC_SSP1->DR; //假讀取去清空FIFO
}
}

/*-------------SSP1-發(fā)送數(shù)據(jù)-----------------*/
void SSP1_WriteByte(unsigned char data)
{
uint8_t Dummy;

LPC_SSP1->DR = data; //載入要發(fā)送的數(shù)據(jù)
while (LPC_SSP1->SR & (1 << 4)){} //等待發(fā)送完成
Dummy=LPC_SSP1->DR; //假讀取去清空FIFO
}

/*-------------SSP1-接收數(shù)據(jù)-----------------*/
uint8_t SSP1_RegisterByte(void)
{
LPC_SSP1->DR = 0xFF; //無(wú)效指令
while (LPC_SSP1->SR & (1 << 4)){} //忙等待

return (LPC_SSP1->DR); //接收數(shù)據(jù)
}


/*---------------------W25Q16---------------*/
//---------寫(xiě)使能---
void SSP_FLASH_WriteEnable(void)
{
FLASH_CS_LOW();
SSP0_WriteByte(0x06);
FLASH_CS_HIGH();
}
//--------等待寫(xiě)完成--
void SSP_FLASH_WaitForWriteEnd(void)
{
uint16_t i=2000;
uint8_t FLASH_Status = 0;

FLASH_CS_LOW();
SSP0_WriteByte(0x05);
do
{
FLASH_Status = SSP0_RegisterByte();
i--;
}
while (((FLASH_Status & 0x01) == 1)||(i==0));
FLASH_CS_HIGH();

}

/*----關(guān)于擦除---在寫(xiě)入數(shù)據(jù)之前必須保證被寫(xiě)入的位值是0xff---這就是擦除的作用*/

//-------------扇區(qū)擦除----------
void SSP_FLASH_SectorErase(uint32_t SectorAddr)
{
SSP_FLASH_WriteEnable();//寫(xiě)使能
SSP_FLASH_WaitForWriteEnd();//忙狀態(tài)

FLASH_CS_LOW();//CS=0
SSP0_WriteByte(0x20);//0x20
SSP0_WriteByte((SectorAddr & 0xFF0000) >> 16);//擦除扇區(qū)起始地址
SSP0_WriteByte((SectorAddr & 0xFF00) >> 8);
SSP0_WriteByte(SectorAddr & 0xFF);
FLASH_CS_HIGH();//CS=1

SSP_FLASH_WaitForWriteEnd();//忙狀態(tài)--等待擦除完成
}
//-----------塊擦除-------
void SSP_FLASH_BlockErase(uint32_t BlockAddr)
{
BlockAddr*=65536;//0x010000
SSP_FLASH_WriteEnable();//寫(xiě)使能
SSP_FLASH_WaitForWriteEnd();

FLASH_CS_LOW();
SSP0_WriteByte(0xD8);//0xD8
SSP0_WriteByte((BlockAddr & 0xFF0000) >> 16);//擦除塊起始地址
SSP0_WriteByte((BlockAddr & 0xFF00) >> 8);
SSP0_WriteByte(BlockAddr & 0xFF);
FLASH_CS_HIGH();

SSP_FLASH_WaitForWriteEnd();
}
//----------整片擦除--
void SSP_FLASH_BulkErase(void)
{
SSP_FLASH_WriteEnable(); //寫(xiě)使能

FLASH_CS_LOW();
SSP0_WriteByte(0xc7); //整片擦除
FLASH_CS_HIGH();

SSP_FLASH_WaitForWriteEnd();
}
//---------單頁(yè)寫(xiě)入-----
void SSP_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{
SSP_FLASH_WriteEnable();

FLASH_CS_LOW();
SSP0_WriteByte(0x02);//CMD2--0x02--------頁(yè)寫(xiě)入
SSP0_WriteByte((WriteAddr & 0xFF0000) >> 16);//寫(xiě)入起始地址
SSP0_WriteByte((WriteAddr & 0xFF00) >> 8);
SSP0_WriteByte(WriteAddr & 0xFF);

if(NumByteToWrite > SSP_FLASH_PerWritePageSize) //寫(xiě)入數(shù)據(jù)多余頁(yè)最大數(shù)據(jù)
NumByteToWrite = SSP_FLASH_PerWritePageSize;
while (NumByteToWrite--)
{
SSP0_WriteByte(*pBuffer); //寫(xiě)數(shù)據(jù)
pBuffer++;
}
FLASH_CS_HIGH();

SSP_FLASH_WaitForWriteEnd();
}
//--------多頁(yè)寫(xiě)入---
void SSP_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{
uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;

Addr = WriteAddr % SSP_FLASH_PageSize; //首頁(yè)地址
count = SSP_FLASH_PageSize - Addr;//首頁(yè)要寫(xiě)入的數(shù)據(jù)個(gè)數(shù)
NumOfPage = NumByteToWrite / SSP_FLASH_PageSize;//頁(yè)數(shù)
NumOfSingle = NumByteToWrite % SSP_FLASH_PageSize; //余數(shù)--最后一頁(yè)不滿(mǎn)一頁(yè)個(gè)數(shù)

if (Addr == 0)
{
if (NumOfPage == 0) //只有一頁(yè)
{
SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); //?±?óD′è?
}
else //多頁(yè)
{
while (NumOfPage--) //寫(xiě)滿(mǎn)頁(yè)的數(shù)據(jù)
{
SSP_FLASH_PageWrite(pBuffer, WriteAddr, SSP_FLASH_PageSize);
WriteAddr += SSP_FLASH_PageSize;
pBuffer += SSP_FLASH_PageSize;
}

SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);//寫(xiě)最后不滿(mǎn)一頁(yè)的數(shù)據(jù)
}
}
else
{
if (NumOfPage == 0)
{
if (NumOfSingle > count)
{
temp = NumOfSingle - count;
SSP_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;

SSP_FLASH_PageWrite(pBuffer, WriteAddr, temp);
}
else
{
SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
}
}
else
{
NumByteToWrite -= count;
NumOfPage = NumByteToWrite / SSP_FLASH_PageSize;
NumOfSingle = NumByteToWrite % SSP_FLASH_PageSize;

SSP_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;

while (NumOfPage--)
{
SSP_FLASH_PageWrite(pBuffer, WriteAddr, SSP_FLASH_PageSize);
WriteAddr += SSP_FLASH_PageSize;
pBuffer += SSP_FLASH_PageSize;
}

if (NumOfSingle != 0)
{
SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
}
}
}
//--------讀數(shù)據(jù)-----------
void SSP_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
{
FLASH_CS_LOW();
SSP0_WriteByte(0x03); //CMD3--0x03-----//讀數(shù)據(jù)
SSP0_WriteByte((ReadAddr & 0xFF0000) >> 16);
SSP0_WriteByte((ReadAddr& 0xFF00) >> 8);
SSP0_WriteByte(ReadAddr & 0xFF);

while (NumByteToRead--)
{
*pBuffer = SSP0_RegisterByte();//讀入到指定數(shù)組
pBuffer++;
}
FLASH_CS_HIGH();
}

/*-----------讀取廠家ID------------*/
uint32_t SSP_FLASH_ReadID(void)
{
uint32_t temp1=0,temp2=0,temp3=0,temp=0;

LPC_GPIO0->CLR|=(1<<6); //CS=0

SSP1_WriteByte(0x9F); //讀取ID指令
temp1 =SSP1_RegisterByte(); //廠家編號(hào)
temp2 =SSP1_RegisterByte();//存儲(chǔ)類(lèi)型
temp3 =SSP1_RegisterByte();//容量

temp =(temp1<<16)|(temp2<<8)|(temp3);

LPC_GPIO0->SET|=(1<<6);//CS=1;

return temp;

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

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

關(guān)鍵字: 驅(qū)動(dòng)電源

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

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

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

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

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

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

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

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉