《基于LPC1788的SSP1引脚的正确使用方法及注意事项.doc》由会员分享,可在线阅读,更多相关《基于LPC1788的SSP1引脚的正确使用方法及注意事项.doc(10页珍藏版)》请在三一文库上搜索。
1、基于LPC1788的SSP1引脚的正确使用方法及注意事项在学习过程中,发现一点容易被忽视而又很严重的问题-那就是关于SSP1的引脚使用P07-P08-P09时,是W型IO配置。寄存器的第7位很容易被我们设置为0-但是手册上是要求必须为1,否则不能正常工作,这里我走了一点弯路。#include“ssp_lpc1788.h”#define SPI_FLASH_PageSize 256 /页大小#define SPI_FLASH_PerWritePageSize 256 /写页大小/*-初始化SSP0-*/void SSP0_Init(unsigned long sysClk, unsigned s
2、piClk)volatile uint32_t dummy;dummy = dummy;LPC_IOCON-P2_22 =0x22; / SSP0_SCKLPC_IOCON-P2_26 =0x22; / SSP0_MISOLPC_IOCON-P2_27 =0x22; / SSP0_MOSILPC_IOCON-P2_23=0x30; /SSP1_CS-直接普通上拉IOLPC_GPIO2-DIR “= (1UL 23); /输出LPC_GPIO2-SET|=(123);/置一LPC_SC-PCONP |= (1UL 21); /SSP0 时钟开启LPC_SSP0-CR0 = 0x0007; / 8
3、Bit, CPOL=0, CPHA=0LPC_SSP0-CR1 = 0x0002; / SSP0-使能-主模式LPC_SSP0-CPSR = sysClk/spiClk; /时钟预分频寄存器while( LPC_SSP0-SR /忙while( LPC_SSP0-SR dummy = LPC_SSP0-DR; /假读取去清空FIFO/*-SSP0-发送数据-*/void SSP0_WriteByte(unsigned char data)uint8_t Dummy;LPC_SSP0-DR = data; /载入要发送的数据while (LPC_SSP0-SR Dummy=LPC_SSP0-DR
4、; /假读取去清空FIFO/*-SSP0-接收数据-*/uint8_t SSP0_RegisterByte(void)LPC_SSP0-DR = 0xFF; /无效指令while (LPC_SSP0-SR return (LPC_SSP0-DR); /接收数据/*-SSP1-*/*-初始化SSP1-*/void SSP1_Init(unsigned long sysClk, unsigned spiClk)volaTIle uint32_t dummy;LPC_IOCON-P0_7 =0xA2; / SSP1_SCKLPC_IOCON-P0_8 =0xA2; / SSP1_MISOLPC_IO
5、CON-P0_9 =0xA2; / SSP1_MOSILPC_IOCON-P0_6=0x30; /SSP1_CS-普通上拉IOLPC_GPIO0-DIR |= (1UL 6); /输出LPC_GPIO0-SET|=(16);/置一LPC_SC-PCONP |= (1UL 10); /SSP1 时钟开启LPC_SSP1-CR0 = 0x0007; / 8Bit, CPOL=0, CPHA=0LPC_SSP1-CR1 = 0x0002; / SSP1-使能-主模式LPC_SSP1-CPSR = sysClk/spiClk; /时钟预分频寄存器while( LPC_SSP1-SR /忙while(
6、LPC_SSP1-SR dummy = LPC_SSP1-DR; /假读取去清空FIFO/*-SSP1-发送数据-*/void SSP1_WriteByte(unsigned char data)uint8_t Dummy;LPC_SSP1-DR = data; /载入要发送的数据while (LPC_SSP1-SR Dummy=LPC_SSP1-DR; /假读取去清空FIFO/*-SSP1-接收数据-*/uint8_t SSP1_RegisterByte(void)LPC_SSP1-DR = 0xFF; /无效指令while (LPC_SSP1-SR return (LPC_SSP1-DR)
7、; /接收数据/*-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);doFLASH_Status = SSP0_RegisterByte();i-;while (FLASH_Status FLASH_CS_HI
8、GH();/*-关于擦除-在写入数据之前必须保证被写入的位值是0xff-这就是擦除的作用*/-扇区擦除-void SSP_FLASH_SectorErase(uint32_t SectorAddr)SSP_FLASH_WriteEnable();/写使能SSP_FLASH_WaitForWriteEnd();/忙状态FLASH_CS_LOW();/CS=0SSP0_WriteByte(0x20);/0x20SSP0_WriteByte(SectorAddr /擦除扇区起始地址SSP0_WriteByte(SectorAddr SSP0_WriteByte(SectorAddr FLASH_CS
9、_HIGH();/CS=1SSP_FLASH_WaitForWriteEnd();/忙状态-等待擦除完成/-块擦除-void SSP_FLASH_BlockErase(uint32_t BlockAddr)BlockAddr*=65536;/0x010000SSP_FLASH_WriteEnable();/写使能SSP_FLASH_WaitForWriteEnd();FLASH_CS_LOW();SSP0_WriteByte(0xD8);/0xD8SSP0_WriteByte(BlockAddr /擦除块起始地址SSP0_WriteByte(BlockAddr SSP0_WriteByte(B
10、lockAddr 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)S
11、SP_FLASH_WriteEnable();FLASH_CS_LOW();SSP0_WriteByte(0x02);/CMD2-0x02-页写入SSP0_WriteByte(WriteAddr /写入起始地址SSP0_WriteByte(WriteAddr SSP0_WriteByte(WriteAddr if(NumByteToWrite SSP_FLASH_PerWritePageSize) /写入数据多余页最大数据NumByteToWrite = SSP_FLASH_PerWritePageSize;while (NumByteToWrite-)SSP0_WriteByte(*pBuf
12、fer); /写数据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
13、- Addr;/首页要写入的数据个数NumOfPage = NumByteToWrite / SSP_FLASH_PageSize;/页数NumOfSingle = NumByteToWrite % SSP_FLASH_PageSize; /余数-最后一页不满一页个数if (Addr = 0)if (NumOfPage = 0) /只有一页SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); /?D?else /多页while (NumOfPage-) /写满页的数据SSP_FLASH_PageWrite(pBuffer, Write
14、Addr, SSP_FLASH_PageSize);WriteAddr += SSP_FLASH_PageSize;pBuffer += SSP_FLASH_PageSize;SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);/写最后不满一页的数据elseif (NumOfPage = 0)if (NumOfSingle count)temp = NumOfSingle - count;SSP_FLASH_PageWrite(pBuffer, WriteAddr, count);WriteAddr += count;pBuffer +=
15、count;SSP_FLASH_PageWrite(pBuffer, WriteAddr, temp);elseSSP_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);elseNumByteToWrite -= count;NumOfPage = NumByteToWrite / SSP_FLASH_PageSize;NumOfSingle = NumByteToWrite % SSP_FLASH_PageSize;SSP_FLASH_PageWrite(pBuffer, WriteAddr, count);WriteAddr += co
16、unt;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);/-读数据-void SSP_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAd
17、dr, uint16_t NumByteToRead)FLASH_CS_LOW();SSP0_WriteByte(0x03); /CMD3-0x03-/读数据SSP0_WriteByte(ReadAddr SSP0_WriteByte(ReadAddrSSP0_WriteByte(ReadAddr while (NumByteToRead-)*pBuffer = SSP0_RegisterByte();/读入到指定数组pBuffer+;FLASH_CS_HIGH();/*-读取厂家ID-*/uint32_t SSP_FLASH_ReadID(void)uint32_t temp1=0,temp2=0,temp3=0,temp=0;LPC_GPIO0-CLR|=(16); /CS=0SSP1_WriteByte(0x9F); /读取ID指令temp1 =SSP1_RegisterByte(); /厂家编号temp2 =SSP1_RegisterByte();/存储类型temp3 =SSP1_RegisterByte();/容量temp =(temp116)|(temp28)|(temp3);LPC_GPIO0-SET|=(16);/CS=1;return temp;
链接地址:https://www.31doc.com/p-3411023.html