www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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



#include"ssp_lpc1788.h"


#define SPI_FLASH_PageSize 256 //頁大小
#define SPI_FLASH_PerWritePageSize 256 //寫頁大小


/*----------------初始化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 時鐘開啟

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

LPC_SSP0->CPSR = sysClk/spiClk; //時鐘預(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; //無效指令
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 時鐘開啟

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

LPC_SSP1->CPSR = sysClk/spiClk; //時鐘預(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; //無效指令
while (LPC_SSP1->SR & (1 << 4)){} //忙等待

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


/*---------------------W25Q16---------------*/
//---------寫使能---
void SSP_FLASH_WriteEnable(void)
{
FLASH_CS_LOW();
SSP0_WriteByte(0x06);
FLASH_CS_HIGH();
}
//--------等待寫完成--
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)于擦除---在寫入數(shù)據(jù)之前必須保證被寫入的位值是0xff---這就是擦除的作用*/

//-------------扇區(qū)擦除----------
void SSP_FLASH_SectorErase(uint32_t SectorAddr)
{
SSP_FLASH_WriteEnable();//寫使能
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();//寫使能
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(); //寫使能

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

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

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

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

SSP_FLASH_WaitForWriteEnd();
}
//--------多頁寫入---
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; //首頁地址
count = SSP_FLASH_PageSize - Addr;//首頁要寫入的數(shù)據(jù)個數(shù)
NumOfPage = NumByteToWrite / SSP_FLASH_PageSize;//頁數(shù)
NumOfSingle = NumByteToWrite % SSP_FLASH_PageSize; //余數(shù)--最后一頁不滿一頁個數(shù)

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

SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);//寫最后不滿一頁的數(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(); //廠家編號
temp2 =SSP1_RegisterByte();//存儲類型
temp3 =SSP1_RegisterByte();//容量

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

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

return temp;

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉