基于LPC1788的SSP1引脚的正确使用方法及注意事项

发布者:trendsetter10最新更新时间:2021-08-25 来源: elecfans关键字:LPC1788  注意事项 手机看文章 扫描二维码
随时随地手机看文章

在学习过程中,发现一点容易被忽视而又很严重的问题---那就是关于SSP1的引脚使用P0[7]-P0[8]-P0[9]时,是W型IO配置。寄存器的第7位很容易被我们设置为0--但是手册上是要求必须为1,否则不能正常工作,这里我走了一点弯路。

基于LPC1788的SSP1引脚的正确使用方法及注意事项

#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; //时钟预分频寄存器

while( LPC_SSP0-》SR & ( 1 《《 4 ) ); //忙

while( LPC_SSP0-》SR & ( 1 《《 2 ) ) //接收FIFO不为空

{

dummy = LPC_SSP0-》DR; //假读取去清空FIFO

}

}

/*-------------SSP0-发送数据-----------------*/

void SSP0_WriteByte(unsigned char data)

{

uint8_t Dummy;

LPC_SSP0-》DR = data; //载入要发送的数据

while (LPC_SSP0-》SR & (1 《《 4)){}//等待发送完成

Dummy=LPC_SSP0-》DR; //假读取去清空FIFO

}

/*-------------SSP0-接收数据-----------------*/

uint8_t SSP0_RegisterByte(void)

{

LPC_SSP0-》DR = 0xFF; //无效指令

while (LPC_SSP0-》SR & (1 《《 4)){}//忙等待

return (LPC_SSP0-》DR); //接收数据

}

/*-----------------------------------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; //时钟预分频寄存器

while( LPC_SSP1-》SR & ( 1 《《 4 ) ); //忙

while( LPC_SSP1-》SR & ( 1 《《 2 ) ) //接收FIFO不为空

{

dummy = LPC_SSP1-》DR; //假读取去清空FIFO

}

}

/*-------------SSP1-发送数据-----------------*/

void SSP1_WriteByte(unsigned char data)

{

uint8_t Dummy;

LPC_SSP1-》DR = data; //载入要发送的数据

while (LPC_SSP1-》SR & (1 《《 4)){} //等待发送完成

Dummy=LPC_SSP1-》DR; //假读取去清空FIFO

}

/*-------------SSP1-接收数据-----------------*/

uint8_t SSP1_RegisterByte(void)

{

LPC_SSP1-》DR = 0xFF; //无效指令

while (LPC_SSP1-》SR & (1 《《 4)){} //忙等待

return (LPC_SSP1-》DR); //接收数据

}

/*---------------------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();

}

/*----关于擦除---在写入数据之前必须保证被写入的位值是0xff---这就是擦除的作用*/

//-------------扇区擦除----------

void SSP_FLASH_SectorErase(uint32_t SectorAddr)

{

SSP_FLASH_WriteEnable();//写使能

SSP_FLASH_WaitForWriteEnd();//忙状态

FLASH_CS_LOW();//CS=0

SSP0_WriteByte(0x20);//0x20

SSP0_WriteByte((SectorAddr & 0xFF0000) 》》 16);//擦除扇区起始地址

SSP0_WriteByte((SectorAddr & 0xFF00) 》》 8);

SSP0_WriteByte(SectorAddr & 0xFF);

FLASH_CS_HIGH();//CS=1

SSP_FLASH_WaitForWriteEnd();//忙状态--等待擦除完成

}

//-----------块擦除-------

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) //写入数据多余页最大数据

NumByteToWrite = SSP_FLASH_PerWritePageSize;

while (NumByteToWrite--)

{

SSP0_WriteByte(*pBuffer); //写数据

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;//首页要写入的数据个数

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, WriteAddr, SSP_FLASH_PageSize);

WriteAddr += SSP_FLASH_PageSize;

pBuffer += SSP_FLASH_PageSize;

}

SSP_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);//写最后不满一页的数据

}

}

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);

}

}

}

}

//--------读数据-----------

void SSP_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)

{

FLASH_CS_LOW();

SSP0_WriteByte(0x03); //CMD3--0x03-----//读数据

SSP0_WriteByte((ReadAddr & 0xFF0000) 》》 16);

SSP0_WriteByte((ReadAddr& 0xFF00) 》》 8);

SSP0_WriteByte(ReadAddr & 0xFF);

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|=(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;

关键字:LPC1788  注意事项 引用地址:基于LPC1788的SSP1引脚的正确使用方法及注意事项

上一篇:LPC1788 LCD 学习
下一篇:为什么LPC1788不支持Linux

推荐阅读最新更新时间:2024-11-10 20:31

23个投影机安全使用方法注意事项
  投影机在我们日常生活中占有非常重要的地位,无论在学校课堂或是公司会议上,都会经常使用到投影机。那么,我们平常使用投影机的时候,需要注意哪些使用方法呢?使用投影机要了解的注意事项又有哪些?下面我们俩了解下。   根据我们平常积累的投影机使用习惯和常见的问题,主要分为以下情况:   1、不要再不稳的表面上安装此投影机,不要将投影机放在晃动的车、台、桌上。   2、不要将此投影机方在含有液体的容器内,不要将花瓶、花盆、杯子,化妆品、液体(例如水)等放在此投影机上面。   3、请仅按推荐的方法使用附件,不要损坏、切割、处理或用力扭电源线。   4、请按投影机上所提示的选择项使用电源类型。在您无法确认的情况下,请向经销商和当地的电器
[嵌入式]
自激开关电源设计的注意事项
在设计和制作开关电源时。必须注意一些常识。下面以附图所示的自激式开关电源为例加以说明。    1.一次侧和二次侧的绝缘      必须重视交流侧和二次侧的绝缘。对这一问题各国都有相应的规定。如对一次侧和二次侧的相邻印刷电路的间隔(平面距离)为3mm,一次侧和二次侧相邻元件的空间距离为5mm等,并利用变压器来作电气绝缘。   连接一次侧和二次侧的元件有三个,即图中的变压器T1、电容器C12、光耦合器IC2,它们必须满足各自的安全规格。对变压器T1,主要关注其初次级间的绝缘层。C12用于去除来自电源线的噪声,需选用交流电容器。并有足够的耐压,其容量不能过大。否则会增大泄漏电流。    2.一次侧元件不能有
[电源管理]
自激开关电源设计的<font color='red'>注意事项</font>
防爆音叉液位开关安装注意事项
  音叉液位开关是一种采用音叉原理设计的液位检测仪表,适用于容器、储罐、槽罐、管道中的液位测量。在工业生产中,音叉液位开关有很多应用处于爆炸性环境中,故计为公司提供有防爆型音叉液位开关供用户选择。   计为防爆型音叉液位开关有两种类型,分为隔爆型和本质安全型(简称本安型)。隔爆型音叉液位开关主要是利用金属外壳将电气元件密闭起来,以阻止点燃源与危险性气体接触。本安型音叉液位开关主要是通过限制电气回路中的能量并配合电气设备的结构设计, 使得电气回路不可能产生达到点燃源要求的能量。 计为防爆型音叉液位开关   除了遵守一般音叉液位开关的安装注意事项外,由于上述防爆形式的差异,防爆音叉液位开关的安装注意事项也有所区别:
[测试测量]
防爆音叉液位开关安装<font color='red'>注意事项</font>
LPC1788--TIMER匹配中断设置--寄存器操作
简单记录LPC1788定时器匹配中断设置--通过寄存器直接操作 #include timer_lpc1788.h #include uart_lpc1788.h void TIMER0_IRQHandler(void) //TIMER0中断函数 { if(((LPC_TIM0- IR) &(1 0))==(1 0)) //匹配中断发生 { UARTSendStr( CLOS\r\n ); } LPC_TIM0- IR |=(1 0);//清除匹配中断标志位 } void TIMER0_Init(uint32_t clk, uint32_t howtime) { LPC_SC- PCONP|=(1 1);
[单片机]
LED平板灯结构剖析及设计注意事项
  随着 LED灯具 行业的发展,作为 LED 背光衍生而出的LED平板灯,其光线均匀,无眩光,结构精致,得到了很多人的喜爱,本人通过2年对平板灯的设计开发,浅谈下平板灯结构设计及注意事项,希望对大家能提供帮助    面光源的结构主要有以下材料:   1.铝框架   外观结构,及LED散热主要构造——一般使用AL6063,铝挤模,前期成本投入低,表面处理美观,散热效果好,前些日子去看展也有发现有厂商开始做压铸的框架,这样IP等级可以做高一点,且封光好些,整体美观,但是前期投入模具费用较高   2.扩散板   将导光板的光均匀的散出,还有起到遮挡网点作用——扩散板一般使用亚克力2.0的板材或PC料,亚克力的成本较低且透光率比PC高
[电源管理]
Cortex-M3 (NXP LPC1788)之GPIO
经过前一篇的分析,现在可以进入C环境进行各个模块的学习。首先进行简单的GPIO控制LED灯的操作,开发板通过GPIO1.18控制LED灯,电路如下图: 为了对LPC1788的内部结构有更好的理解和学习,虽然NXP给出了封装好的库函数,但是我将自己编写代码便于直接对内部原理进行分析。代码如下 #define rFIO1DIR (*(volatile unsigned*)0x20098020) //高速GPIO 方向控制寄存器,用于配置管脚的输入或输出,默认为输入 #define rFIO1MASK (*(volatile unsigned*)0x20098030) //高速GPIO 屏蔽寄存器
[单片机]
Cortex-M3 (NXP <font color='red'>LPC1788</font>)之GPIO
变压器变比测试仪的应用特性及注意事项
变压器变比测试仪是以单片机为核心进行测量计算和自动控制,全中文菜单操作界面,具有显示直观、稳定性好、精度高、测量范围宽且现场不需三相电源等优点的新一代智能化变比测试仪器。 特性: 1、可精确测量各种配电变压器的容量,无源测量,方便、准确。 2、内部自带电源、自动产生三相大功率测试电源。 3、可测量各种类型的变压器的空载电流、空载损耗、短路电压、短路损耗。 4、可自动进行波形畸变校正,温度校正,电压校正,电流校正(非额定电流条件下的短路试验),操作人员只需根据变压器类型输入校正指数仪器即可自动计算出校正后的结果,非常适合没有做稍大容量变压器短路试验条件的单位。 5、电压回路宽量限:电压最大可测量到750V,不用切换档位即可保证精
[测试测量]
光时域反射仪的特点及使用注意事项
光时域反射仪是通过对测量曲线的分析,了解光纤的均匀性、缺陷、断裂、接头耦合等若干性能的仪器。它根据光的后向散射与菲涅耳反向原理制作,利用光在光纤中传播时产生的后向散射光来获取衰减的信息。 光时域反射仪会打入一连串的光突波进入光纤来检验。检验的方式是由打入突波的同一侧接收光讯号,因为打入的讯号遇到不同折射率的介质会散射及反射回来。反射回来的光讯号强度会被量测到,并且是时间的函数,因此可以将之转算成光纤的长度。可以用来量测光纤的长度、衰减,包括光纤的熔接处及转接处皆可量测。在光纤断掉时也可以用来量测中断点。 特点: 1、业界最先进的双色双料一体化模具工艺,坚固耐用;具有多种测试模式、触摸屏及快捷健操作。 2、45dB大动态范
[测试测量]
光时域反射仪的特点及使用<font color='red'>注意事项</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved