《chapter814第5章lpc2200系列arm硬件结构嵌入式课件》由会员分享,可在线阅读,更多相关《chapter814第5章lpc2200系列arm硬件结构嵌入式课件(124页珍藏版)》请在金锄头文库上搜索。
1、第5章 LPC2200系列ARM硬件结构第5章 目录q1.简介q2.引脚配置q3.存储器寻址q4.系统控制模块q5.存储器加速模块q6.外部存储器控制器q7.引脚连接模块q8. 向量中断控制器q9.GPIOq10.UART0q11.UART1q12.I2C接口q13.SPI接口q14.定时器0/1q15.脉宽调制器(PWM)q16.A/D转换器q17.实时时钟q18.看门狗5.9 GPIOLPC2200系列作为 “微控制器”,其通用并行I/O口( GPIO)具有如下的特性:可以独立控制每个GPIO口的方向(输入/输出模式);可以独立设置每个GPIO的输出状态(高/低电平);所有GPIO口在复位
2、后默认为输入状态。5.9 GPIO通用名称描述访问类型复位值IOPINGPIO引脚值寄存器,不管方向模式如何,引脚的当前状态都可以从该寄存器中读出只读NAIOSETGPIO输出置位寄存器。该寄存器控制引脚输出高电平读/置位0x0000 0000IOCLRGPIO输出置位寄存器。该寄存器控制引脚输出低电平只清零0x0000 0000IODIRGPIO方向控制寄存器。该寄存器单独控制每个IO口的方向读/写0x0000 0000 GPIO相关寄存器描述PINSELxIOxDIRIOxCLRIOxPINIOxSETinout10GPIO相关寄存器描述IOxPINIOxPIN描述复位值31 : 0GPI
3、O引脚值。IOxPIN0对应于Px.0 IOxPIN31对应于Px.31引脚未定义 该寄存器反映了当前引脚的状态。IOxPIN中的x对应于某一个端口,如P1口对应于IO1PIN。所以芯片存在多少个端口,就有多少个IOxPIN分别与之对应。 写该寄存器会将值保存到输出寄存器,具体使用稍后介绍。注意:无论引脚被设置为输入还是输出模式,都不影响引脚状态的读出。PINSELxIOxDIRIOxCLRIOxPINIOxSETinout10GPIO相关寄存器描述IOxDIRIOxDIR描述复位值31 : 0方向控制位。IOxDIR0对应于Px.0 IOxDIR31对应于Px.31引脚未定义 当引脚设置为G
4、PIO输出模式时,可使用该寄存器控制引脚的方向。向某位写入1使对应引脚作为输出功能,写入0时作为输入功能。 作为输入功能时,引脚处于高阻态。PINSELxIOxDIRIOxCLRIOxPINIOxSETinout10GPIO相关寄存器描述IOxSETIOxSET描述复位值31 : 0输出置位。IOxSET0对应于Px.0 IOxPIN31对应于Px.31引脚未定义 当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出高电平。向某位写入1使对应引脚输出高电平。写入0无效。 从该寄存器读回的数据为GPIO输出寄存器的值。该值不反映外部环境对引脚的影响。PINSELxIOxDIRIOxCLRIO
5、xPINIOxSETinout10GPIO相关寄存器描述IOxCLRIOxCLR描述复位值31 : 0输出清零。IOxCLR0对应于Px.0 IOxCLR31对应于Px.31引脚未定义 当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出低电平。向某位写入1使对应引脚输出低电平。写入0无效。注意:读取该寄存器无效,不能读回输出寄存器的值。5.10 GPIO使用GPIO注意要点引脚设置为输出方式时,输出状态由IOxSET和IOxCLR中最后操作的寄存器决定;大部分GPIO输出为推挽方式(个别引脚为开漏输出),正常拉出/灌入电流均为4mA(短时间极限值40mA);复位后默认所有GPIO为输入模
6、式。 . PINSEL0 &= 0xFFFFFFFC; IO0DIR |= 0x00000001; IO0SET = 0x00000001; .C代码:PINSEL0IO0DIRIO0CLRIO0PINIO0SETinout10GPIO应用示例设置P0.0输出高电平P0.0(1) 设置引脚连接模块,P0.0为GPIO(2) 设置P0.0口方向,设置为输出(3) 设置P0.0口状态,输出高电平1 . uint32 PinStat; PINSEL0 &= 0xFFFFFFFC; IO0DIR &= 0xFFFFFFFE; PinStat = IO0PIN; .C代码:PINSEL0IO0DIRIO
7、0CLRIO0PINIO0SETinout10GPIO应用示例读取P0.0引脚状态P0.0(1) 设置引脚连接模块,P0.0为GPIO(2) 设置P0.0口方向,设置为输入(3) 从IO0PIN读取引脚状态IO0PIN#define DataBus 0xFF PINSEL0 &= 0xFFFF0000; IO0DIR |= DataBus; IO0CLR = DataBus; IO0SET = Data; .使用IOxSET和IOxCLR实现:GPIO应用示例输出多位数据至IO口(1) 设置引脚连接模块,P0.07为GPIO(2) 设置P0.0口方向,设置为输出(3) 清零8位IO口的输出状态
8、 在需要将多位数据同时输出到某几个IO口线时,通常使用IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存器实现。后者可以在多个IO口上直接输出0和1电平。 本例将8位无符号整数变量Data的值输出到P0.0P0.7。(4) Data变量中为1的位将输出高电平0x?0x00Data数据输出线:#define DataBus 0xFF PINSEL0 &= 0xFFFF0000; IO0DIR |= DataBus; IO0PIN = (IO0SET & 0xFFFFFF00) | Data; .GPIO应用示例输出多位数据至IO口(1) 设置引脚连接模块,P0.0为GPIO
9、(2) 设置P0.0口方向,设置为输出(3) 写IO0PIN,输出数据 在需要将多位数据同时输出到某几个IO口线时,通常使用IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存器实现。后者可以在多个IO口上直接输出0和1电平。 本例将8位无符号整数变量Data的值输出到P0.0P0.7。使用IOxPIN实现:0x?Data数据输出线:0x?0x00Data与前者对比:第5章 目录q1.简介q2.引脚配置q3.存储器寻址q4.系统控制模块q5.存储器加速模块q6.外部存储器控制器q7.引脚连接模块q8. 向量中断控制器q9.GPIOq10.UART0q11.UART1q12.
10、I2C接口q13.SPI接口q14.定时器0/1q15.脉宽调制器(PWM)q16.A/D转换器q17.实时时钟q18.看门狗5.10 UART0 简介串行通信口(UART),LPC2200包含两个UART:UART0和UART1 其中UART0具有如下的特性:16字节接收FIFO和16字节发送FIFO;寄存器位置符合16C550工业标准;接收FIFO触发点可设置为1、4、8或14字节;内置波特率发生器。5.10 UART0 使用UART0通信需要两个引脚,分别为:引脚名称类型描述RxD0输入串行输入,接收数据TxD0输出串行输出,发送数据U0THRU0TSRTxD0U0RBRU0RSRRxD
11、0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL1.在使用UART之前需要设置的寄存器UART0内部结构示意图U0LCRU0IERU0FCRU0DLM U0DLLFIFO控制中断使能UART0格式设置波特率设置U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL2.发送数据的通道UART0内部结构示意图U0THRU0TSRVPB接口CPU内核通过VPB接口对UART0的寄存器进行读写访问发送缓存发送移位寄存器U0THRU0TSRTxD0U0R
12、BRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL3.接收数据的通道UART0内部结构示意图U0RBRU0RSRVPB接口接收缓存接收移位寄存器U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL4.通信过程中可能影响的标志位UART0内部结构示意图U0LSRU0IIR中断标志UART0当前状态UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U
13、0FCR与CPU内核相连U0DLM U0DLLU0RBRU0RBR描述复位值7 : 0接收缓存寄存器,它包含了接收FIFO中最早接收到的字节未定义 U0RSR移位寄存器从RxD0引脚接收的有效数据将被送到接收FIFO中。通过读取U0RBR寄存器可以将接收FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。注意: U0RBR只读。访问该寄存器时,U0LCR的除数锁存访问位(DLAB)必须为0。接收缓存寄存器UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU
14、0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLLU0THR描述复位值7 : 0发送器保持寄存器,写入该寄存器的值保存到发送FIFO中,当该字节到达FIFO底部时,它将被送入发送移位寄存器(U0TSR)进行发送。未定义 写入该寄存器的值将是发送FIFO中的最高字节。访问该寄存器时,U0LCR的除数锁存访问位(DLAB)必须为0。注意: U0THR只写。它的地址与U0RBR相同,通过读/写操作予以区分。U0THR发送器保持寄存器U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM
15、U0DLLU0THRU0THRU0TSRTxD0RxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLUART0相关寄存器描述名称描述复位值U0DLL7:0除数锁存寄存器低字节两个寄存器一起构成一个16位的除数,决定UART0的波特率。未定义U0DLM7:0除数锁存寄存器高字节 这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。波特率计算公式如下:BaudRate = FPCLK / (U0DLM,U0DLL16)除数锁存寄存器U0DLM U0DLL注意:由于U0DLL、U0DLM寄存器与其它寄存器的地址重叠,所以在访问它们时,U0LCR的除数锁存访问位(DL
16、AB)必须为1。U0THRU0TSRTxD0RxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLUART0相关寄存器描述U0IER描述复位值0RBR中断使能。1:使能RDA中断;0:禁止RDA中断。01THRE中断使能。1:使能THRE中断;0:禁止THRE中断。02Rx线状态中断使能。1:禁止Rx线状态中断;0:禁止Rx线状态中断;该中断状态可从U0LSR4:1读出。07 : 3保留,用户软件不要向这些位写入1。未定义中断使能寄存器U0IER U0IER可以控制UART0的4个中断源。其中RBR中断使能包括两个中断,一个是接收数据可用(RDA)中断,一个是接收超时中断(CT
17、I)。稍后将对各中断源作详细介绍。U0THRU0TSRTxD0RxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLUART0相关寄存器描述U0IIR描述复位值0中断挂起。1:没有挂起的中断;0:至少有一个中断被挂起。03 : 1中断标识。这3位表示了对应于UART0 Rx FIFO的中断。未列出的其它组合作为保留值。011:1. 接收线状态中断(RLS)0010:2a. 接收数据可用中断(RDA)0110:2b. 字符超时指示(CTI)001:3. 发送中断(THRE)7 : 3保留,用户软件不要向这些位写入1。未定义中断标识寄存器 U0IIR提供状态代码用于指示一个挂起中断
18、的中断源和优先级。在访问U0IIR过程中,中断被冻结。如果在访问U0IIR时产生了中断,该中断将被记录,在下次访问U0IIR时可以读出,避免了中断的丢失。U0IIRU0THRU0TSRTxD0RxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLUART0相关寄存器描述中断标识寄存器中断源和中断使能的关系U0IIRRLS中断(U0IIR3:1=011)RDA中断(U0IIR3:1=010)CTI中断(U0IIR3:1=110)THRE中断(U0IIR3:1=001)VIC中断控制器ARM7TDMI内核U0IERbit2bit1bit0优先级最高第二第二第三U0THRU0TSRT
19、xD0RxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLUART0相关寄存器描述中断标识寄存器U0IIRRLS中断RDA中断CTI中断THRE中断VIC中断控制器ARM7TDMI内核U0IERbit2bit1bit0中断源和中断使能的关系UART0相关寄存器描述中断源说明l RLS中断:该中断为最高优先级。它在UART0产生了四个错误条件(溢出错误(OE)、奇偶错误(PE)、帧错误(FE)和间隔中断(BI))中的任意一个时置位。通过查看U0LSR4:1可以了解到产生该中断的错误条件。读取U0LSR时清除该中断;UART0相关寄存器描述中断源说明lRDA中断:该中断与CTI中
20、断并列为第二优先级。当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位;1.移位寄存器(U0RSR)从RxD0引脚接收串行数据后,送入接收FIFO中;2.当接收FIFO中的有效数据数量到达预定的触发点时,置位RDA中断;3.从U0RBR寄存器中读取FIFO中最早到达的数据,当FIFO中的有效数据小于预定触发点时,清零RDA中断;接收FIFO12345679101112131415168触发点设置=8U0RBRU0RSRRxD0U0IIR3:1xxxU0IIR010100xxx1DATAUART0相关寄存器描
21、述中断源说明lCTI中断:该中断为第二优先级。当接收FIFO中的有效数据少于预定的触发点数量,但至少有一个字节时,如果超过接收3.54.5个字节所需要的时间仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志;接收FIFO12345679101112131415168触发点设置=8U0RBR1.移位寄存器(U0RSR)从RxD0引脚接收串行数据后,送入接收FIFO中;2.当接收FIFO中的有效数据少于触发个数,但至少有一个时,如果长时间没有数据到达,将触发CTI中断;3.从U0RBR中读取接收FIFO中的数据,或者有新的数据送入接收FIFO,都将清零CTI中断;U0RS
22、RDATARxD0U0IIR3:1xxxU0IIR011100xxx1UART0相关寄存器描述中断源说明lCTI中断:该中断为第二优先级。当接收FIFO中的有效数据少于预定的触发点数量,但至少有一个字节时,如果超过接收3.54.5个字节所需要的时间仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志;接收FIFO12345679101112131415168触发点设置=8U0RBR说明:“3.54.5个字节的时间”,其意思是在串口当前的波特率下,发送3.54.5个字节所需要的时间;U0RSRDATARxD0U0IIR3:1xxxU0IIR011100xxx1注意:当接收
23、FIFO中存在多个数据,从U0RBR读取数据,但是没有读完所有数据,那么在经过3.54.5个字节的时间后将触发CTI中断;12345679101112131415168U0RBRU0TSRTxD0U0IIR3:1xxxU0IIR01UART0相关寄存器描述中断源说明lTHRE中断:该中断为第三优先级。当发送FIFO为空并且满足一定的条件时,该中断将被触发。这些条件是:发送FIFO1.系统启动时,虽然发送FIFO为空,但不会产生THRE中断。DATA1100U0TSR2.在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在延时一个字节加上一个停止位后发生THRE中断。 这是因为:如
24、果发送移位寄存器为空,那么写入发送FIFO的数据将直接进入发送移位寄存器; 此时发送FIFO仍然为空,如果立即产生THRE中断,就会影响紧接着要写入发送FIFO的数据; 所以在发送完该字节以及一个停止位后,才产生THRE中断;3.如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。当THRE中断为当前有效的最高优先级中断时,往U0THR写数据,或者对U0IIR的读操作,将使THRE中断复位。UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0D
25、LM U0DLL位765 : 3210功能Rx触发点设置复位TxFIFO复位RxFIFO使能FIFOFIFO控制寄存器U0FCR U0FCR控制UART0接收和发送FIFO的操作。EnFIFO:FIFO使能。该位的任何变化都将清空UART0的FIFO。 1:使能UART0的接收和发送FIFO,并且允许访问U0FCR7:1。 0:禁止接收FIFO,此时接收缓存只有1个字节。而发送FIFO不会被关闭。UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位765 : 3210
26、功能Rx触发点设置复位TxFIFO复位RxFIFO使能FIFOFIFO控制寄存器U0FCR复位RxFIFO:接收FIFO复位。当该位置位时,UART0接收FIFO中的所有字节被清零并复位指针逻辑。注意:该位会自动清零。UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位765 : 3210功能Rx触发点设置复位TxFIFO复位RxFIFO使能FIFOFIFO控制寄存器U0FCR复位TxFIFO:发送FIFO复位。当该位置位时,UART0发送FIFO中的所有字节被清零并
27、复位指针逻辑。注意:该位会自动清零。UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位765 : 3210功能Rx触发点设置复位TxFIFO复位RxFIFO使能FIFOFIFO控制寄存器U0FCR:这些位保留,用户程序不要向这些位写入1。UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位765 : 3210功能Rx触发点设置复位TxFIF
28、O复位RxFIFO使能FIFOFIFO控制寄存器U0FCRRx触发点设置:通过设置这两位可以调整接收FIFO中触发RDA中断的有效字节数量。00:触发点0(1字节);01:触发点1(4字节);10:触发点2(8字节);11:触发点3(14字节);U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLLU0THRU0TSRTxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLP11D0D1D2D3D4D5D6D70UART0相关寄存器描述线状态控制寄存器U0LCR位765 : 462
29、1 :0功能除数锁存间隔奇偶选择奇偶设置停止位字长起始位U0LCR寄存器: U0LCR控制发送和接收数据帧的格式。U0THRU0TSRTxD0U0LCRU0LSRU0IIRU0IERU0DLM U0DLLU0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLLUART0相关寄存器描述线状态控制寄存器位765 : 4621 :0功能除数锁存间隔奇偶选择奇偶设置停止位字长字长:这些位控制数据长度。00:5位字符长度;01:6位字符长度;10:7位字符长度;11:8位字符长度;位765 : 4621 :
30、0功能除数锁存间隔奇偶选择奇偶设置停止位字长U0LCRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL线状态控制寄存器U0LCR位765 : 4621 :0功能除数锁存间隔奇偶选择奇偶设置停止位字长停止位:控制每帧数据包含的停止位个数。0:1个停止位;1:2个停止位;UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL线状态控制寄存器U0LC
31、R位765 : 4621 :0功能除数锁存间隔奇偶选择奇偶使能停止位字长奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。0:禁止奇偶产生和校验;1:使能奇偶产生和校验;奇偶选择:设置奇偶校验类型。00:奇数(数据位+校验位奇数);01:偶数(数据位+校验位偶数);10:校验位强制为1;11:校验位强制为0;UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL线状态控制寄存器U0LCR位765 : 4621 :0功能除数锁存间隔奇偶选择奇偶使能停止位字长
32、间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方(LPC2000)产生间隔中断。在某些通信方式中,使用间隔中断作为通信的起始信号(如:LIN Bus)。0:禁止间隔发送;1:使能间隔发送;UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL线状态控制寄存器U0LCR位765 : 4621 :0功能除数锁存间隔奇偶选择奇偶使能停止位字长除数锁存:因为U0DLL和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。0:禁止访问除数
33、锁存寄存器;1:使能访问除数锁存寄存器;UART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器 U0LSR为只读寄存器,它反映了UART0接收和发送模块的状态信息。RDR:接收数据就绪。判断该位是否置一,决定能否从FIFO中读取数据。 0:U0RBR为空; 1:U0RBR中包含有效数据。从接收FIFO中读走所有数据后,恢复为0。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0
34、RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器OE:溢出错误标志。当U0RBR寄存器中已经有新的字符就绪,而接收FIFO已满时,该位置位。 0:接收缓存区没有溢出; 1:接收缓存区发生溢出错误。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOE
35、RDR线状态寄存器PE:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。 0:没有发生奇偶校验错误; 1:发生奇偶校验错误。读操作使该位恢复为0。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。 0:没有发生帧错误; 1:发生帧错误。读取该位时恢复为0。
36、U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器BI:间隔中断标志。在发送数据时,如果RXD0引脚保持低电平,将产生间隔中断。发生间隔中断后,接收模块停止数据接收。 0:没有发生间隔中断; 1:发生间隔中断。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0D
37、LM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器THRE:反映U0THR是否为空,也可以认为发送FIFO是否为空。 0:不为空; 1:空。对U0THR进行写操作,使该位恢复为0。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器TEMT:当发送移位寄存器和U0THR均为空时,该位置位。 0:不为空; 1:空。对U0THR进行写操作,
38、使该位恢复为0。U0LSRUART0相关寄存器描述U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLL位76543210功能RXFETEMTTHREBIFEPEOERDR线状态寄存器RXFE:如果一个带有接收错误(如帧错误、奇偶错误或间隔中断)的字符装入U0RBR时,该位置位。 0:U0RBR中没有接收错误,或U0FCR0为0; 1:U0RBR中包含至少一个UART0 Rx错误。U0LSR5.10 UART0使用UART0注意要点 U0RBR与U0THR在同一地址上,但实际上是两个独立的寄存器
39、,读操作时选择U0RBR,写操作时选择U0THR; U0DLL与U0RBR/U0THR、U0DLM与U0IER在同一地址上,通过除数访问位DLAB选择。当该位为1时,选择U0DLL和U0DLM。为0时,选择U0RBR/U0THR和U0IER; 无论在U0FCR中是否使能FIFO,接收FIFO不能被禁止。关闭FIFO后,接收FIFO只有一个字节缓冲; 波特率计算公式:U0DLM、U0DLL = FPCLK/(16baud);UART0应用示例操作流程设置引脚连接模块将对应IO连接到UART0设置串口波特率设置串口工作模式发送或接收数据检查串口状态字或等待串口中断UART0应用示例初始化代码UAR
40、T0初始化代码:#define UART_BPS 115200Void UART0_Ini(void) uint16 Fdiv; PINSEL0 = 0x00000005; U0LCR = 0x83; Fdiv = (Fpclk / 16) / UART_BPS; U0DLM = Fdiv / 256; U0LLM = Fdiv % 256; U0LCR = 0x03;定义表示波特率的宏,方便修改设置引脚连接模块置位除数锁存位根据波特率计算分频值设置除数寄存器(除数锁存访问位必须置位)清除除数锁存位,并设置工作模式UART0应用示例初始化代码UART0初始化代码:#define UART_BP
41、S 115200Void UART0_Ini(void) uint16 Fdiv; PINSEL0 = 0x00000005; U0LCR = 0x83; Fdiv = (Fpclk / 16) / UART_BPS; U0DLM = Fdiv / 256; U0LLM = Fdiv % 256; U0LCR = 0x03;设置引脚连接模块将对应IO连接到UART0设置串口波特率设置串口工作模式发送或接收数据检查串口状态字或等待串口中断UART0应用示例收发数据void UART0_SendByte(uint8 data) U0THR = data; while(U0LSR & 0x40) =
42、 0);uint8 UART0_RcvByte(void) uint8 rcv_data; while(U0LSR & 0x01) = 0); rcv_data = U0RBR; return(rcv_data);查询方式发送一字节数据:查询方式接收一字节数据:将要发送的一字节数据写入U0THR等待数据发送完毕等待数据到达从U0RBR中读出接收的数据返回接收的数据第5章 目录q1.简介q2.引脚配置q3.存储器寻址q4.系统控制模块q5.存储器加速模块q6.外部存储器控制器q7.引脚连接模块q8. 向量中断控制器q9.GPIOq10.UART0q11.UART1q12.I2C接口q13.SPI
43、接口q14.定时器0/1q15.脉宽调制器(PWM)q16.A/D转换器q17.实时时钟q18.看门狗5.11 UART1特性 UART1与UART0基本功能相同,但是增加了一个调制解调器(Modem)接口。所以UART1具有UART0的所有特性。16字节接收FIFO和16字节发送FIFO;寄存器位置符合16C550工业标准;接收FIFO触发点可设置为1、4、8或14字节;内置波特率发生器。UART1具有一个标准的Modem接口,这些引脚为:引脚名称类型描述RxD1输入串行输入,接收数据TxD1输出串行输出,发送数据CTS1输入清除发送,指示外部modem的接收是否已经准备就绪。低电平有效,表
44、示UART1数据可通过TxD1发送。DCD1输入数据载波检测,指示外部modem是否已经与UART1建立了通信连接。低电平有效,表示可以进行数据交换。DSR1输入数据设备就绪,指示外部modem是否准备建立与UART1的连接,低电平有效。DTR1输出数据终端就绪,有效低电平指示UART1准备建立与外部modem的连接。RI1输入铃响指示,指示modem检测到电话的响铃信号,低电平有效。RTS1输出请求发送,指示UART1打算向外部modem发送数据,低电平有效。使用UART1通信UART0内部结构 UART1的结构与UART0类似,在其基础上增加了控制MODEM接口的寄存器。UART1内部结构
45、示意图U0THRU0TSRTxD0U0RBRU0RSRRxD0U0LCRU0LSRU0IIRU0IERVPB接口U0FCR与CPU内核相连U0DLM U0DLLU1THRU1TSRTxD0U1RBRU1RSRRxD0U1LCRU1LSRU1IIRU1IERVPB接口U1FCR与CPU内核相连U1DLM U1DLLMODEMU1MSRU1MCRCTSDSRRIDCDDTRRTS5.11 UART1位76543210U1IER0000使能Modem中断使能Rx线状态中断使能THRE 中断使能Rx数据可用中断U1MCR000回送00RTSDTRU1MSRDCDRIDSRCTSDelta DCD后沿R
46、IDelta DSRDelta CTS UART1包含12个8位寄存器,其中大部分寄存器与UART0类似,所以仅介绍不同之处。UART1寄存器描述位76543210U1IER0000使能Modem中断使能Rx线状态中断使能THRE 中断使能Rx数据可用中断使能Modem中断:当该位置位时,允许Modem中断。 Modem中断为最低优先级中断,只要在Modem输入引脚DCD、DSR或CTS上发生任何状态变化,该中断就会激活。此外,Modem输入口RI上出现由低到高的电平跳变会产生一个Modem中断。Modem中断源可通过检查U1MSR3:0得到。读取U1MSR将清除Modem中断。 Mdoem中
47、断在U0IIR中的标志为0x00。5.11 UART1中断使能寄存器UART1寄存器描述5.11 UART1Modem控制寄存器UART1寄存器描述位功能功能描述0DTR控制选择Modem输出引脚DTR。该位在回写模式激活时读出为0。1RTS控制选择Modem输出引脚RTS。该位在回写模式激活时读出为0。3 : 2保留用户软件不要向该位写入14回写模式0:禁止modem回写模式1:使能modem回写模式modem回写模式提供了一个执行回写测试的诊断机制。7 : 5保留用户软件不要向该位写入1 该寄存器使能Modem的回写模式,并控制Modem的输出信号。5.11 UART1回写模式UART1寄
48、存器描述 在Modem回写模式下,发送器输出的串行数据在内部连接到接收器的串行输入端。输入脚RxD1对回写模式无影响,输出脚TxD1保持总为1的状态。 4个modem输入(CTS, DSR, RI和DCD)与外部断开,并在内部与4个modem输入连接。这样连接的结果是U1MSR的高4位由U1MCR的低4位驱动。这样在回写模式下,写U1MCR的低4位就可产生modem状态中断。 位功能功能描述0Delta CTS检测到CTS状态发生变化时,该位置位。读取U1MSR时清零。1Delta DSR检测到DSR状态发生变化时,该位置位。读取U1MSR时清零。2后沿 RI检测到RI状态发生变化时,该位置位
49、。读取U1MSR时清零。3Delta DCD检测到DCD状态发生变化时,该位置位。读取U1MSR时清零。4CTS反映输入信号CTS的补码。回写模式下该位连接U1MCR的bit1。5DSR反映输入信号DSR的补码。回写模式下该位连接U1MCR的bit0。6RI反映输入信号RI的补码。回写模式下该位连接U1MCR的bit2。7DCD反映输入信号DCD的补码。回写模式下该位连接U1MCR的bit1。Modem状态寄存器UART1寄存器描述 该寄存器为只读,它反映Modem输入信号的状态信息。需要注意的是,Mdoem信号对UART1的操作没有直接影响,Modem信号的操作是通过软件来实现的。第5章 目
50、录q1.简介q2.引脚配置q3.存储器寻址q4.系统控制模块q5.存储器加速模块q6.外部存储器控制器q7.引脚连接模块q8. 向量中断控制器q9.GPIOq10.UART0q11.UART1q12.I2C接口q13.SPI接口q14.定时器0/1q15.脉宽调制器(PWM)q16.A/D转换器q17.实时时钟q18.看门狗5.12 I2C接口特性 LPC2200系列微控制器具有一到两个标准的I2C接口,它具有如下特性:可配置为主机、从机或主/从机;可编程时钟可实现通讯速率控制;主机从机之间双向数据传输;同时发送的主机之间进行仲裁,避免了总线数据的冲突。5.12 I2C接口I2C简介 I2C接
51、口是Philips推出的一种串行总线方式,用于IC器件之间的通信。它通过SDA(串行数据线)和SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并通过软件寻址识别每个器件,而不需要片选线。 I2C接口的标准传输速率为100Kbit/s,最高传输速率可达400Kbit/s。5.12 I2C接口I2C简介电气连接 I2C总线接口均为开漏或开集电极输出,因此需要为总线增加上拉电阻Rp。总线速率越高,总线上拉电阻就越小,100Kbit/s总线速率,通常使用5.1K欧姆的上拉电阻I2C简介总线时序 在数据传送过程中,必须确认数据传送的开始和结束,这通过起始和结束信号识别。起始信号结束信号SDAS
52、CLSPS从器件地址 R/W第一字节 发送起始信号后传送的第一字节数据具有特别的意义,其中前七位为从机地址,最后一位为读写方向位(0表示写,1表示读)。I2C简介总线时序 I2C总线数据传送时,每传送一个字节数据后都必须有应答信号(A)。主控器接收数据时,如果要结束通信时,将在停止位之前发送非应答信号( )。SDASCL应答信号非应答信号AAI2C简介总线时序 LPC2200在I2C通信中可以配置为主控器也可以作为被控器,那么它就具有4种操作模式:主发送模式、主接收模式、从发送模式和从接收模式。S从器件地址WA数据A数据A/ AP主发送模式:S从器件地址RA数据A数据AP主接收模式:S从器件地
53、址WA数据A数据A/ AP/RS从发送模式:S从器件地址RA数据A数据AP从接收模式:主机到从机主机到从机A = 应答(SDA为低)A = 非应答(SDA为高)S = 起始信号P = 停止信号RS = 重复起始信号5.12 I2C接口寄存器描述 I2C接口包含7个寄存器。名称描述访问复位值地址I2CONSETI2C控制置位寄存器读/置位00xE001C000I2STATI2C状态寄存器 只读0xF80xE001C004I2DATI2C数据寄存器 读/写00xE001C008I2ADRI2C从地址寄存器 读/写00xE001C00CI2SCLHSCL占空比寄存器高半字读/写0x040xE001C
54、010I2SCLLSCL占空比寄存器低半字 读/写0x040xE001C014I2CONCLRI2C控制清零寄存器 只清零NA0xE001C018寄存器描述I2C控制置位寄存器 I2CONSET寄存器用于置位I2C通信的相关标志位,该寄存器只能对某位置位,而不能清零,清零通过I2CONCLR寄存器完成。位功能描述复位值1:0保留用户程序不要向这些位写入1NA2AA应答标志03SII2C中断标志04STO停止标志05STA起始标志06I2ENI2C接口使能07保留用户程序不要向该位写入1NA寄存器描述I2C控制置位寄存器位功能描述复位值1 : 0保留用户程序不要向这些位写入1NA2AA应答标志0
55、3SII2C中断标志04STO停止标志05STA起始标志06I2ENI2C接口使能07保留用户程序不要向该位写入1NA位7654321 : 0功能保留I2ENSTASTOSIAA保留AA:为声明应答标志。 当该位置位时,在SCL线的应答时钟脉冲内,出现下面的任意条件之一将产生一个应答信号(SDA线为低电平):接收到从地址寄存器中的地址。当I2ADR中的通用调用位(GC)置位时,接收到通用调用地址。当I2C接口处于主接收模式时,接收到一个数据字节。当I2C接口处于可寻址的从接收模式时,接收到一个数据字节。 向I2CONCLR寄存器中的AAC位写入1会使AA位清零。当AA为零时,在SCL线的应答时
56、钟脉冲内,出现下列情况将返回一个非应答信号(SDA线为高电平):当I2C接口处于主接收模式时,接收到一个数据字节。当I2C接口处于可寻址的从接收模式时,接收到一个数据字节。寄存器描述I2C控制置位寄存器位7654321 : 0功能保留I2ENSTASTOSIAA保留SI:为I2C中断标志。 当进入25种可能的I2C状态中的任何一个后,该位置位。通常,I2C中断只在空闲的从器件中用于指示一个起始条件,或在一个空闲的主器件(如果它等待使用I2C总线)中指示一个停止条件。向I2CONCLR寄存器中的SIC位写入1使SI位清零。 寄存器描述I2C控制置位寄存器位7654321 : 0功能保留I2ENS
57、TASTOSIAA保留STO:为停止标志。 当STO为1时,在主模式中,向I2C总线发送一个停止条件或在从模式中使总线从错误状态中恢复。当总线检测到停止条件时,STO自动清零。 在从模式中,置位STO位可从错误状态中恢复。这种情况下不向总线发送停止条件。硬件的表现就好像是接收到一个停止条件并切换到不可寻址的从接收模式。STO标志由硬件自动清零。 寄存器描述I2C控制置位寄存器位7654321 : 0功能保留I2ENSTASTOSIAA保留STA:为起始标志。 当STA=1时,I2C接口进入主模式并发送一个起始条件,如果已经处于主模式,则发送一个重复起始条件。 STA可在任何时候置位,当I2C接
58、口处于可寻址的从模式时,STA也可以置位。寄存器描述I2C控制置位寄存器位7654321 : 0功能保留I2ENSTASTOSIAA保留I2EN:为I2C接口使能。 当该位置位时,使能I2C接口。向I2CONCLR寄存器中的I2ENC位写入1将使I2EN位清零。当I2EN位为0时,I2C功能被禁止。 寄存器描述I2C控制清零寄存器 I2CONCLR寄存器与I2CONSET寄存器的功能相反,它用于清零I2C通信的相关标志位,该寄存器只能对某位清零,而不能置位。位功能描述复位值1:0保留用户程序不要向这些位写入1NA2AA应答标志NA3SII2C中断标志NA4STO停止标志NA5STA起始标志NA
59、6I2ENI2C接口使能NA7保留用户程序不要向该位写入1NA寄存器描述I2C状态寄存器 I2STAT寄存器包含了I2C接口的状态代码,它是一个只读寄存器。一共有26种可能存在的状态代码。当代码为0xF8时,无可用的相关信息,SI位不会置位。所有其它25种状态代码都对应一个已定义的I2C状态。当进入其中一种状态时,SI位将置位。 I2C处理程序就是根据该寄存器反映的状态来进行相应的处理。位功能描述复位值2 : 0状态这3个位总是为007 : 3状态状态位1寄存器描述I2C数据寄存器 I2DAT寄存器包含要发送或刚接收的数据。当它没有处理字节的移位时,CPU可对其进行读写。该寄存器只能在SI置位
60、时访问。在SI置位期间,I2DAT中的数据保持稳定。I2DAT中的数据移位总是从右至左进行:第一个发送的位是MSB(位7),在接收字节时,第一个接收到的位存放在I2DAT的MSB。位功能描述复位值7 : 0数据发送/接收数据位0寄存器描述I2C从地址寄存器 I2ADR寄存器只能在I2C设置为从模式时才能使用。在主模式中,该寄存器无效。I2ADR的LSB为通用调用位。当该位置位时,通用调用位(0x00)被识别(即可以对广播地址0x00作出响应)。 位功能描述复位值0GC通用调用位07 : 1地址从模式地址0寄存器描述I2C占空比寄存器 I2SCLH、I2SCLL寄存器用于控制I2C通信的波特率。
61、其中I2SCLH定义SCL高电平所保持的PCLK周期数,而I2SCLL定义SCL低电平所保持的PCLK周期数。那么位频率(即总线速率)由下面的公式得出:位频率 = Fpclk / (I2SCLH + I2SCLL)寄存器功能描述复位值I2SCLH计数值SCL高电平周期占用PCLK周期数0x04I2SCLL计数值SCL低电平周期占用PCLK周期数0x04I2SCLLI2SCLH5.12 I2C接口使用I2C接口的注意要点I2C接口的引脚为开漏输出,必须在I2C总线上接上拉电阻。通信速率越快,电阻值越小;总线上各器件的地址不能冲突;编程时需要仔细处理每个状态,注意各状态之间的转移关系。5.12 I
62、2C接口I2C应用示例 LPC2200对于I2C通信的处理是基于状态标志进行的,不同的模式之间具有相通的分析方法,这里仅介绍常用的主发送和主接收模式。I2C应用示例主模式设置设置引脚连接模块(PINSEL0)设置通信波特率(I2SCLH、I2SCLL)使能主I2C(I2CONSET)设置中断向量(VICxxx)主模式初始化流程I2C应用示例主模式设置设置引脚连接模块(PINSEL0)设置通信波特率(I2SCLH、I2SCLL)使能主I2C(I2CONSET)设置中断向量(VICxxx)主模式初始化流程设置引脚连接模块(PINSEL0)设置通信波特率(I2SCLH、I2SCLL)使能主I2C(I
63、2CONSET)设置中断向量(VICxxx)主模式初始化流程Void I2C_init(uint32 fi2c) if(fi2c 400000) fi2c = 400000; PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x05; I2SCLH = (Fpclk / fi2c + 1) / 2; I2SCLL = (Fpclk / fi2c) / 2; I2CONCLR = 0x2C; I2CONSET = 0x40; VICIntSelect = 0x00000000; VICVectCntl0 = 0x29; VICVectAddr0 = (int)IRQ_I2C
64、; VICIntEnable = 0x0200;初始化代码传入参数为I2C时钟频率过滤传入参数,最高400K时钟频率I2C应用示例 LPC2200在该模式下作为主控器,向从机发送数据。数据流向如下图所示:主机发送LPC2200(主)I2C应用示例主模式数据发送的时序格式主机发送S从器件地址WA数据A数据A/ AP起始位,用于指示传输的开始。结束位,用于指示传输的结束。第一字节的前七位包含接收器件的从地址,第8位表示为写操作。每发送完一个字节数据,接收数据的器件就发送一个应答位每发送完一个字节数据,接收数据的器件就发送一个应答位每发送完一个字节数据,接收数据的器件就发送一个应答位每发送完一个字节
65、数据,接收数据的器件就发送一个应答位I2C应用示例主模式数据发送的时序格式主机发送S从器件地址WA数据A数据A/ AP (1) (2) (3) (3) (4)(1)通过软件置位STA进入I2C主发送模式,I2C逻辑在总线空闲后立即发送一个起始信号;(2)在起始信号发送结束后,SI置位。将从机地址和写操作位装入I2DAT,然后清零SI,将第一字节数据发出;(3)当从机地址和W位发送结束并收到应答位(A)后,SI位再次置位。此时将要发送的数据装入I2DAT,开始发送数据;(4)在数据正确发送后,SI置位。此时如果要结束本次操作,那么置位STO位,发送结束信号。I2C应用示例主模式数据发送的时序格式
66、主机发送S从器件地址WA数据A数据A/ AP0x080x180x280x280x30正确的状态号 在通信过程中,随着通信阶段的不同,I2STAT寄存器中的状态号也相应的变化,并引起中断。在中断服务程序中,根据当前的状态号来决定下一步的处理。如果当前的状态号不符合正常操作的流程,那么就要作出相应的错误处理,比如重新启动总线等。0x200x300x38错误的状态号你要发送数据调用函数ISendStr()ISendStr()I2C中断IRQ_I2C()设置I2C中断处理所需的全局变量(如从机地址)清除STA、SI和AA标志位置位STA,启动I2C总线读取I2C操作完成标志I2C_end判断操作是否正
67、确,然后返回I2C_end=1?YN读取I2C状态码(即I2CSTAT)根据状态码进行相应的处理(状态码08H、18H、20H、28H、38H)按全局变量的设置进行数据操作及设置软件标志清除中断逻辑,然后中断返回主模式数据发送流程图I2C应用示例 LPC2200在该模式下作为主控器,接收从机发出的数据。数据流向如下图所示:主机接收LPC2200(主)S从器件地址RA数据A数据AP主接收模式:I2C应用示例主模式数据接收的时序格式主机接收起始位,用于指示传输的开始。结束位,用于指示传输的结束。第一字节的前七位包含接收器件的从地址,第8位为1,表示读操作。每接收完一个字节数据,就发送一个应答位。在
68、接收最后一个字节数据后,发送非应答位,通知从机停止发送数据。I2C应用示例主模式数据接收的时序格式主机接收 (1) (2) (3) (4) (4)(1)通过软件置位STA进入I2C主发送模式,I2C逻辑在总线空闲后立即发送一个起始信号;(2)在起始信号发送结束后,SI置位。将从机地址和读操作位装入I2DAT,然后清零SI,将第一字节数据发出;(3)当从机地址和R位发送结束并收到应答位(A)后,SI位再次置位。此时设置AA位,然后清零SI位,开始接收数据;(4)每接收到一字节数据,SI位再次置位,此时可以再次接收数据,或者置位STO结束总线。S从器件地址RA数据A数据AP主接收模式:0x080x
69、400x500x500x58正确的状态号 在通信过程中,随着通信阶段的不同,I2STAT寄存器中的状态号也相应的变化,并引起中断。在中断服务程序中,根据当前的状态号来决定下一步的处理。如果当前的状态号不符合正常操作的流程,那么就要作出相应的错误处理,比如重新启动总线等。0x380x580x48错误的状态号I2C应用示例主模式数据接收的时序格式S从器件地址RA数据A数据AP主接收模式:主机接收你要发送数据调用函数ISendStr()ISendStr()I2C中断IRQ_I2C()设置I2C中断处理所需的全局变量(如从机地址)清除STA、SI和AA标志位置位STA,启动I2C总线读取I2C操作完成
70、标志I2C_end判断操作是否正确,然后返回I2C_end=1?YN读取I2C状态码(即I2CSTAT)根据状态码进行相应的处理(状 态 码 08H、38H、40H、48H、50H、58H)按全局变量的设置进行数据操作及设置软件标志清除中断逻辑,然后中断返回主模式数据接收流程图第5章 目录q1.简介q2.引脚配置q3.存储器寻址q4.系统控制模块q5.存储器加速模块q6.外部存储器控制器q7.引脚连接模块q8. 向量中断控制器q9.GPIOq10.UART0q11.UART1q12.I2C接口q13.SPI接口q14.定时器0/1q15.脉宽调制器(PWM)q16.A/D转换器q17.实时时钟
71、q18.看门狗5.13 SPI接口特性 大部分LPC2200系列微控制器具有两个硬件SPI接口(LPC2104/LPC2105/LPC2106只有一个),它们具有如下特性:完全独立的SPI控制器;遵循同步串行接口(SPI)规范;全双工数据通信;可配置为SPI主机或从机;最大数据位速率为外设时钟Fpclk的1/8。5.13 SPI接口SPI简介 SPI是一种全双工的同步串行接口,一个SPI总线可以连接多个主机和多个从机。在同一时刻只允许一个主机操作总线,并且同时只能和一个从机通信。 串行时钟由主机产生,当主机发送一字节数据(通过MOSI)的同时,从机返回一字节数据(通过MISO)。 使用SPI通
72、信需要4个引脚,分别为:引脚名称类型描述SCK输入/输出串行时钟,用于同步SPI接口间数据传输的时钟信号。该时钟信号总是由主机输出。SSEL输入从机选择,SPI从机选择信号是一个低有效信号,用于指示被选择参与数据传输的从机。每个从机都有各自特定的从机选择输入信号。MISO输入/输出主入从出,MISO信号是一个单向的信号,它将数据由从机传输到主机。MOSI输入/输出主出从入,MOSI信号是一个单向的信号,它将数据从主机传输到从机。SPI电气连接SPI主机LPC2200SPI从机1SPI从机2SSELSPI BUSP0.1P0.2nCSnCS作SPI主机时,SSEL要接上拉电阻时钟相位为1时钟前沿
73、数据输出时钟后沿数据采样时钟信号极性0极性1从机选择时钟相位为0时钟前沿数据采样时钟后沿数据输出SPI传输时序时钟前沿输出时钟后沿采样时钟前沿采样时钟后沿输出SPI工作模式 LPC2200在SPI通信中可作为从机也可以作为主机,这取决于硬件设计和软件设置。 当器件作为主机时,使用一个IO引脚拉低相应从机的选择引脚(SSEL),传输的起始由主机发送数据来启动,时钟(SCK)信号由主机产生。通过MOSI发送数据,同时通过MISO引脚接收从机发出的数据。 当器件作为从机时,传输在从机选择引脚(SSEL)被主机拉低后开始,接收主机输出的时钟信号,在读取主机数据的同时通过MISO引脚输出数据。SPI接口
74、内部结构SCK_inSCK_outSS_inSPI移位寄存器SPI状态寄存器SPI时钟发生器&检测器输出使能逻辑SPI寄存器接口SPI中断VPB总线SPI总线SCK_out_enMOSI_out_enMISO_out_enSPI寄存器描述名称描述访问复位值SPI0名称SPI1名称SPCRSPI控制寄存器。该寄存器控制SPI的操作模式。读写0S0SPCRS1SPCRSPSRSPI状态寄存器。该寄存器显示SPI的状态。只读0S0SPSRS1SPSRSPDRSPI数据寄存器。该双向寄存器为SPI提供发送和接收的数据。发送数据通过写该寄存器提供。SPI接收的数据可以从该寄存器读出。读写0S0SPDRS
75、1SPDRSPCCRSPI时钟计数寄存器。该寄存器控制主机SCK的频率。读写0S0SPCCRS0SPCCRSPINTSPI中断标志寄存器。该寄存器包含SPI接口的中断标志。读写0S0SPINTS0SPINTSPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留 SPCR寄存器包含一些可编程位来控制SPI功能模块的功能,该寄存器必须在数据传输之前进行设定。SPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留CPHA:时钟相位控制。 该位决定SPI传输时数据和时钟的关系,并控制从机传输的起始和结束。当
76、该位为:1:时钟前沿数据输出,后沿数据采样;0:时钟前沿数据采样,后沿数据输出;SPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留CPOL:时钟极性控制。1:SCK为低有效;0:SCK为高有效;SPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留CPOL:主模式控制。1:SPI处于主模式;0:SPI处于从模式;SPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留LSBF:字节移动方向控制。1:每字节数据从低位(LSB)开始传输;0:每字节数据从
77、高位(MSB)开始传输;SPI寄存器描述SPI控制寄存器位765432 : 0功能SPIELSBFMSTRCPOLCPHA保留SPIE:SPI中断使能。 1:每次SPIF或MODF置位时都会产生硬件中断; 0:SPI中断被禁止;SPI寄存器描述SPI状态寄存器 SPSR寄存器为只读寄存器,用于监视SPI功能模块的状态,包括一般性功能和异常状况。SPSR功能描述复位值2 :0保留用户程序不要向这些保留位写入1。NA3ABRT从机中止标志。为1时表示发生了从机中止。读取该位清零。04MODF模式错误。为1时表示发生了模式错误。先通过读取该寄存器清零MODF位,再写SPI控制寄存器。05ROVR读溢
78、出。为1时表示发生了读溢出。当读取该寄存器时,该位清零。 06WCOL写冲突。为1时表示发生了写冲突。先通过读取该寄存器清零WCOL位,再访问SPI数据寄存器。 07SPIFSPI传输完成标志。为1时表示一次SPI数据传输完成。当第一次读取该寄存器时,该位清零。然后才能访问SPI数据寄存器。注:SPIF不是SPI中断标志。中断标志位于SPINT寄存器中。 0SPI寄存器描述SPI状态寄存器读溢出:当SPI功能模块内部读缓冲区包含没有读出的数据,而新的传输已经完成,就会发生读溢出。如果SPIF位置位 (读缓冲区已满),新接收到的数据将会丢失,而状态寄存器的读溢出 (ROVR)位将置位。 写冲突:
79、在SPI数据传输过程当中不应向SPI数据寄存器写入数据。不能向SPI数据寄存器写入数据的时间从传输启动时开始,直到SPIF置位时读取状态寄存器为止。如果在这段时间内写SPI数据寄存器,写入的数据将会丢失,状态寄存器中的写冲突位(WCOL)置位。 模式错误:SSEL信号在SPI功能模块为主机时必须无效,不能用作GPIO。当SPI功能模块为主机时,如果SSEL信号被激活(将SSEL变为低电平),表示有另外一个主机将该器件选择为从机。这种状态称为模式错误。 从机中止:如果SSEL信号在传输结束之前变为高电平,从传输将被认为中止。此时,正在处理的发送或接收数据都将丢失,状态寄存器的从机中止(ABRT)
80、位置位。 SPI寄存器描述SPI数据寄存器 SPDR寄存器为SPI提供数据的发送和接收。处于主模式时,向该寄存器写入数据,将启动SPI数据传输。从数据传输开始到SPIF状态位置位并且没有读取状态寄存器的这段时间内不能对该寄存器执行写操作。SPDR功能描述复位值7 : 0数据SPI双向数据0SPI寄存器描述SPI时钟计数寄存器 作为主机时,SPCCR寄存器控制SCK的频率。寄存器的值为一位SCK时钟所占用的PCLK周期数。该寄存器的值必须为偶数,并且必须不小于8。如果寄存器的值不符合以上条件,可能会导致产生不可预测的动作。SPI速率 = Fpclk / SPCCRSPCCR功能描述复位值7 :
81、0计数值设定SPI时钟计数值0SPI寄存器描述SPI中断寄存器 该寄存器包含SPI接口的中断标志。SPCCR功能描述复位值0SPI中断SPI中断标志。向该位写入1清零。注:当SPIE位置一,并且SPIF和WCOL位种至少有一位为1时,该位置位。但是只有当SPI中断位置位并且SPI中断在VIC种被使能,SPI中断才能有中毒处理软件处理。07 : 1保留用户程序不要向这些位写入1NA5.13 SPI接口使用SPI接口的注意要点作主机时,SSEL引脚必须接上拉电阻,不能作为IO口使用;作主机时,在发送一字节数据的同时接收一字节数据;SPI时钟分频值必须大于或等于8;数据寄存器与内部移位寄存器之间没有
82、缓冲区,写SPDR会使数据直接进入移位寄存器。因此数据只能在上一次数据发送完成后写入SPDR寄存器。SPI应用示例作为主机操作流程设置SPI时钟速率(SPCCR)设置为SPI主机(SPCR)选择从机发送一字节数据启动SPI数据传输等待数据发送结束(SPIF)读出从机发送的数据或释放从机SPI应用示例作为主机操作流程设置SPI时钟速率(SPCCR)设置为SPI主机(SPCR)选择从机发送一字节数据启动SPI数据传输等待数据发送结束(SPIF)读出从机发送的数据或释放从机操作流程设置SPI时钟速率(SPCCR)设置为SPI主机(SPCR)选择从机发送一字节数据启动SPI数据传输等待数据发送结束(S
83、PIF)读出从机发送的数据或释放从机SPI初始化代码:#define MSTR(1 5)#define CPOL(1 4)#define CPHA (1 3)#define LSBF (1 6)#define SPI_MODE (MSTR | CPOL)void MSpiIni(uint8 fdiv) if(fdiv 8) fdiv = 8; S0PCCR = fdiv & 0xFE; S0PCR = SPI_MODE;过滤分频值,如果小于8为非法SPI应用示例作为主机操作流程设置SPI时钟速率(SPCCR)设置为SPI主机(SPCR)选择从机发送一字节数据启动SPI数据传输等待数据发送结束(
84、SPIF)读出从机发送的数据或释放从机SPI主机发送和接收程序:#define MSTR(1 5)#define CPOL(1 4)#define CPHA (1 3)#define LSBF (1 6)#define SPI_MODE (MSTR | CPOL)uint8 MSendData(uint8 data) IO0CLR = HC595_CS; S0PDR = data; while(0 = (S0PSR & 0x80); IO0SET = HC595_CS; return(S0PDR);SPI应用示例作为从机操作流程设置为SPI从机(SPCR)将要发送的数据放入SPDR等待数据发送
85、结束(SPIF)从SPDR中读出接收的数据SPI应用示例作为从机操作流程设置为SPI从机(SPCR)将要发送的数据放入SPDR等待数据发送结束(SPIF)从SPDR中读出接收的数据操作流程设置为SPI从机(SPCR)将要发送的数据放入SPDR等待数据发送结束(SPIF)从SPDR中读出接收的数据SPI初始化代码:;初始化从机void SSpiIni(uint8 fdiv) S0PCR = (1 4);收发一字节数据uint8 SSwapData(uint8 data) S0PDR = data; while(0 = (S0PSR & 0x80); return(S0PDR);SPI应用示例作为从机操作流程设置为SPI从机(SPCR)将要发送的数据放入SPDR等待数据发送结束(SPIF)从SPDR中读出接收的数据SPI初始化代码:void SSpiIni(uint8 fdiv) S0PCR = (1 4);uint8 SSwapData(uint8 data) S0PDR = data; while(0 = (S0PSR & 0x80); return(S0PDR);