在线时间2082 小时
UID3253523
注册时间2016-3-21
NXP金币1143
该用户从未签到
超级版主
- 积分
- 19555
- 最后登录
- 2024-3-29
|
本帖最后由 小恩GG 于 2016-10-13 17:04 编辑
该文作为LPC小经验资料收集。
很多网友在使用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;
- }
- }
复制代码 屏蔽原来配置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模式为例:
- 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引脚的灵活控制。
小小经验收集,为后续遇到类似问题的网友提供便利。
|
|