CH573无法使用映射引脚SPI

RT

PRINT( "1.spi0 mul slave mode \n");
  GPIOPinRemap(ENABLE,RB_PIN_SPI0);
  GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);
  GPIOB_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);
  SPI0_SlaveInit();
  /*i = SPI0_SlaveRecvByte();
  PRINT( "recv:%d\n",i);
  SPI0_SlaveSendByte( ~i );*/

  SPI0_SlaveRecv( spiBuffrev, 5 );
  PRINT( "%d",spiBuffrev[0]);
  PRINT( "%d",spiBuffrev[1]);
  PRINT( "%d",spiBuffrev[2]);
  PRINT( "%d",spiBuffrev[3]);
  PRINT( "%d\n",spiBuffrev[4]);
  SPI0_SlaveTrans( spiBuffrev, 5 );
  SPI0_SlaveDMARecv( spiBuffrev, 12 );
  SPI0_SlaveDMATrans( spiBuffrev, 12 );

使用PB引脚,作为从机时,只能接收到数据而不能发送数据。使用PA引脚没有这个问题

您好,CH573如果需要更改映射引脚,可以参考手册,如果需要修改,只要对这位寄存器进行操作即可

image.png


GPIOPinRemap(ENABLE,RB_PIN_SPI0);

已经操作过了,看上面代码。没用,只能接收不能发送


/******************************************************************************

      函数说明:LCD得SPI接口初始化,使用SPI0(PB脚),模式0.

     入口数据:无

      返回值:  无

******************************************************************************/

void LCD_SPI_Init(void)

{

  R16_PIN_ALTERNATE |= 0x0100;

  LCD_GPIO_Init();

  GPIOB_SetBits( GPIO_Pin_12 );

  GPIOB_ModeCfg( GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeOut_PP_5mA );

  SPI0_MasterDefInit();

}


你可以参考这个例子,然后移植过去试一下。



麻烦自己亲自试下,你的代码里有几个问题,1.我是SPI从机,你这个是主机,GPIOB_ModeCfg我只能设为输入。

我把GPIO配成输出连接收都不行


 R16_PIN_ALTERNATE |= 0x0100;

//  GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);

GPIOB_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14, GPIO_ModeIN_PU);

GPIOB_SetBits( GPIO_Pin_15 );

GPIOB_ModeCfg( GPIO_Pin_15 , GPIO_ModeOut_PP_5mA );

  SPI0_SlaveInit();

i = SPI0_SlaveRecvByte();

  SPI0_SlaveSendByte( i );

CH573代码。

GPIOA_SetBits( GPIO_Pin_12 );

GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14, GPIO_ModeOut_PP_5mA);

    SPI0_MasterDefInit( );

 

// 单字节发送

GPIOA_ResetBits( GPIO_Pin_12 );   

    SPI0_MasterSendByte(0x55);

GPIOA_SetBits( GPIO_Pin_12 );

DelayMs( 1 );

GPIOA_ResetBits( GPIO_Pin_12 );

i = SPI0_MasterRecvByte();

GPIOA_SetBits( GPIO_Pin_12 );

DelayMs( 2 );

CH579主机代码。

image.png

image.png


SPI0_SlaveInit();
i = SPI0_SlaveRecvByte();
  SPI0_SlaveSendByte( i );

不知道这个是不是从机,我这里不知道为什么就是不行,切换到PA脚就没问题,用的是CH573开发板


从机PB可以接收,但是发送不行SPI0_SlaveSendByte( i ),不知道你发出去没


逻辑分析仪抓到了PB发出去的数据,你把我那个573那段代码复制过去试一下。别忘了 R16_PIN_ALTERNATE |= 0x0100;这句。


可以了,多谢,关键的一句话

GPIOB_SetBits( GPIO_Pin_15 );
GPIOB_ModeCfg( GPIO_Pin_15 , GPIO_ModeOut_PP_5mA );

需要吧MISO设置为输出,不然PB不行。PA的话就算设置为输入,他也会自己切换。

@管理员 573的手册要更新一下了


搭车问下,CH573的SPI工作频率最高能到多少?是否可以到主频的一半30M左右?

GPIO的5mA和20mA驱动能力分别对应工作频率是多少?


image.png
image.png

SPI的时钟是最高可以接近主频的1半

IO的驱动能力跟频率在我们的芯片应用上没有直接关系。


只有登录才能回复,可以选择微信账号登录