[资料] 【经验分享】LPC43XX SSP片选引脚的灵活控制
336 查看
0 回复
 楼主 | 发布于 2020-09-18 | 只看楼主
分享到:
该文作为LPC小经验资料收集。
    很多网友在使用LPC43xx SSP模块的时候发现,每发送一个byte,CS都会拉低,然后又拉高,如下图:


   但是实际使用中,比如外部接flash芯片,往往需要一帧多个byte的数据片选,然后再拉高,但是由于CS引脚配置为SSP模块的引脚之后,控制完全是由SSP硬件实现,所以就不会非常灵活,在这种情况下,为了实现CS引脚的灵活控制,通常会将CS引脚配置GPIO输出模式,未发送数据的时候,输出高电平,需要发送数据的时候,把CS引脚拉低,发送完所需要的字节数之后,再拉高。
这里以lpcopen code为例,给出如何实现CS引脚从SSP功能转为GPIO功能的代码修改,LPC43XX的lpcopen代码下载链接:
  1. 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:
  1. void Board_SSP_Init(LPC_SSP_T *pSSP)
  2. {
  3.         if (pSSP == LPC_SSP0) {
  4.                 /* Set up clock and power for SSP0 module */
  5.                 /* Configure SSP0 pins*/
  6.                 Chip_SCU_PinMuxSet(0x3, 3, (SCU_PINIO_FAST | SCU_MODE_FUNC2));        /* P3.3 connected to SCL/SCLK        SCU_MODE_FUNC2=SSP0 SCK0 */
  7.                 Chip_SCU_PinMuxSet(0x3, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC2));        /* P3.6 connected to nCS                SCU_MODE_FUNC2=SSP0 SSEL0 */
  8.                 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 */
  9.                 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 */
  10.         }
  11.         else if (pSSP == LPC_SSP1) {
  12.                 /* Set up clock and power for SSP1 module */
  13.                 /* Configure SSP1 pins*/
  14.                 Chip_SCU_PinMuxSet(0xF, 4, (SCU_PINIO_FAST | SCU_MODE_FUNC0));        /* PF.4 connected to SCL/SCLK        SCU_MODE_FUNC0 = SSP1 SCK1 */
  15. //                Chip_SCU_PinMuxSet(0xF, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC2));        /* PF.5 connected to nCS                SCU_MODE_FUNC2 = SSP1 SSEL1 */
  16. //GPIO CS BEGIN
  17.                 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 */
  18.                 Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 7, 19);//PF_5  mux4 = GPIO7[19]
  19.                 Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1);
  20. //GPIO CS END
  21.                 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 */
  22.                 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 */
  23.         }
  24.         else {
  25.                 return;
  26.         }
  27. }
复制代码
屏蔽原来配置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模式为例:
  1.                         xf_setup.length = 5;
  2.                         xf_setup.tx_data = Tx_Buf;
  3.                         xf_setup.rx_data = Rx_Buf;
  4.                         Tx_Buf[0]=0x21; // one byte program command
  5.                         Tx_Buf[1]=0x31;// two bytes address
  6.                         Tx_Buf[2]=0x32;// two bytes address
  7.                         Tx_Buf[3]=0x41; // two bytes data
  8.                         Tx_Buf[4]=0x42;// two bytes data
  9.                                         xf_setup.rx_cnt = xf_setup.tx_cnt = 0;
  10.                                         Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 0); //发送前GPIO拉低CS
  11.             Chip_SSP_RWFrames_Blocking(LPC_SSP, &xf_setup);
  12.                                         Chip_GPIO_SetPinState(LPC_GPIO_PORT, 7, 19, 1);//发送后GPIO拉高CS
复制代码
最后测试的波形如下:


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





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部