首页 论坛 原厂专区 NXP(freescale) MCU 【经验分享】LPC43XX SSP片选引脚的灵活控制
分享到:
该文作为LPC小经验资料收集。
很多网友在使用LPC43xx SSP模块的时候发现,每发送一个byte,CS都会拉低,然后又拉高,如下图:

但是实际使用中,比如外部接flash芯片,往往需要一帧多个byte的数据片选,然后再拉高,但是由于CS引脚配置为SSP模块的引脚之后,控制完全是由SSP硬件实现,所以就不会非常灵活,在这种情况下,为了实现CS引脚的灵活控制,通常会将CS引脚配置GPIO输出模式,未发送数据的时候,输出高电平,需要发送数据的时候,把CS引脚拉低,发送完所需要的字节数之后,再拉高。
这里以lpcopen code为例,给出如何实现CS引脚从SSP功能转为GPIO功能的代码修改,LPC43XX的lpcopen代码下载链接:
复制代码
配置修改点有如下几点:
1. board.c, lpc_board_keil_mcb_4357中, 函数void Board_SSP_Init(LPC_SSP_T *pSSP)
这里修改SSP1:
复制代码
屏蔽原来配置PF_5作为SSP CS引脚的代码:
Chip_SCU_PinMuxSet(0xF, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC2));
添加:
Chip_SCU_PinMuxSet(0xF, 5, (SCU_MODE_PULLUP| SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC4)); /* PF.5 connected to nCS SCU_MODE_FUNC2 = GPIO */
Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 7, 19);//PF_5 mux4 GPIO7[19],配置GPIO为输出
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1); //输出为高
2. 具体控制的时候,以polling模式为例:
复制代码
最后测试的波形如下:

实现LPC SSP CS引脚的灵活控制。
小小经验收集,为后续遇到类似问题的网友提供便利。
很多网友在使用LPC43xx SSP模块的时候发现,每发送一个byte,CS都会拉低,然后又拉高,如下图:

但是实际使用中,比如外部接flash芯片,往往需要一帧多个byte的数据片选,然后再拉高,但是由于CS引脚配置为SSP模块的引脚之后,控制完全是由SSP硬件实现,所以就不会非常灵活,在这种情况下,为了实现CS引脚的灵活控制,通常会将CS引脚配置GPIO输出模式,未发送数据的时候,输出高电平,需要发送数据的时候,把CS引脚拉低,发送完所需要的字节数之后,再拉高。
这里以lpcopen code为例,给出如何实现CS引脚从SSP功能转为GPIO功能的代码修改,LPC43XX的lpcopen代码下载链接:
- http://www.nxp.com/zh-Hans/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4300-cortex-m4-m0/lpcopen-software-development-platform-lpc43xx:LPCOPEN-SOFTWARE-FOR-LPC43XX
配置修改点有如下几点:
1. board.c, lpc_board_keil_mcb_4357中, 函数void Board_SSP_Init(LPC_SSP_T *pSSP)
这里修改SSP1:
-
void Board_SSP_Init(LPC_SSP_T *pSSP)
-
{
-
if (pSSP == LPC_SSP0) {
-
/* Set up clock and power for SSP0 module */
-
/* Configure SSP0 pins*/
-
Chip_SCU_PinMuxSet(0x3, 3, (SCU_PINIO_FAST | SCU_MODE_FUNC2)); /* P3.3 connected to SCL/SCLK SCU_MODE_FUNC2=SSP0 SCK0 */
-
Chip_SCU_PinMuxSet(0x3, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC2)); /* P3.6 connected to nCS SCU_MODE_FUNC2=SSP0 SSEL0 */
-
Chip_SCU_PinMuxSet(0x3, 7, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* P3.7 connected to SO SCU_MODE_FUNC2=SSP0 MISO0 */
-
Chip_SCU_PinMuxSet(0x3, 8, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* P3.8 connected to nSI SCU_MODE_FUNC2=SSP0 MOSI0 */
-
}
-
else if (pSSP == LPC_SSP1) {
-
/* Set up clock and power for SSP1 module */
-
/* Configure SSP1 pins*/
-
Chip_SCU_PinMuxSet(0xF, 4, (SCU_PINIO_FAST | SCU_MODE_FUNC0)); /* PF.4 connected to SCL/SCLK SCU_MODE_FUNC0 = SSP1 SCK1 */
-
// Chip_SCU_PinMuxSet(0xF, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC2)); /* PF.5 connected to nCS SCU_MODE_FUNC2 = SSP1 SSEL1 */
-
//GPIO CS BEGIN
-
Chip_SCU_PinMuxSet(0xF, 5, (SCU_MODE_PULLUP| SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC4)); /* PF.5 connected to nCS SCU_MODE_FUNC2 = GPIO */
-
Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 7, 19);//PF_5 mux4 = GPIO7[19]
-
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1);
-
//GPIO CS END
-
Chip_SCU_PinMuxSet(0xF, 6, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* PF.6 connected to SO SCU_MODE_FUNC2 = SSP1 MISO1 */
-
Chip_SCU_PinMuxSet(0xF, 7, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* PF.7 connected to nSI SCU_MODE_FUNC2 = SSP1 MOSI1 */
-
}
-
else {
-
return;
-
}
- }
Chip_SCU_PinMuxSet(0xF, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC2));
添加:
Chip_SCU_PinMuxSet(0xF, 5, (SCU_MODE_PULLUP| SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC4)); /* PF.5 connected to nCS SCU_MODE_FUNC2 = GPIO */
Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 7, 19);//PF_5 mux4 GPIO7[19],配置GPIO为输出
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1); //输出为高
2. 具体控制的时候,以polling模式为例:
-
xf_setup.length = 5;
-
xf_setup.tx_data = Tx_Buf;
-
xf_setup.rx_data = Rx_Buf;
-
Tx_Buf[0]=0x21; // one byte program command
-
Tx_Buf[1]=0x31;// two bytes address
-
Tx_Buf[2]=0x32;// two bytes address
-
Tx_Buf[3]=0x41; // two bytes data
-
Tx_Buf[4]=0x42;// two bytes data
-
xf_setup.rx_cnt = xf_setup.tx_cnt = 0;
-
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 0); //发送前GPIO拉低CS
-
Chip_SSP_RWFrames_Blocking(LPC_SSP, &xf_setup);
- Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1);//发送后GPIO拉高CS

实现LPC SSP CS引脚的灵活控制。
小小经验收集,为后续遇到类似问题的网友提供便利。
(0 )
(0 )


发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖