极海半导体-APM32F030的SPI半双工模式下,仅使用MOSI管脚输出,其他管脚(MISO,SCLK,CSS)能否正常复用成其他功能。
背景:项目只需要用MOSI管脚输出的信号控制RGB,其他IO用做其他功能。
背景:项目只需要用MOSI管脚输出的信号控制RGB,其他IO用做其他功能。
-
基于APM32F0xx_SDK_V1.6 APM32F051开发板、APM32F030开发板
-
使用SPI1对应的GPIO为MOSI-PA7、MISO-PA6、SCLK-PA5、CSS-PA4,将SPI初始化代码配置成半双工模式,代码如下。
-
void APM_MINI_SPIInit(void)
-
{
GPIO_Config_T gpioConfig;
SPI_Config_T spiConfig;
/** Enable related clock*/
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
/*屏蔽MISO、SCLK的IO配置*/
// GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_5, GPIO_AF_PIN0);
// GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
/** config PIN_5->SCK , PIN_7->MOSI*/
gpioConfig.pin = GPIO_PIN_7;
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.pupd = GPIO_PUPD_PU;
GPIO_Config(GPIOA, &gpioConfig);
// /** config PIN_4->NSS*/
// gpioConfig.pin = GPIO_PIN_4;
// gpioConfig.outtype = GPIO_OUT_TYPE_PP;
// gpioConfig.speed = GPIO_SPEED_50MHz;
// gpioConfig.pupd = GPIO_PUPD_PU;
// gpioConfig.mode = GPIO_MODE_OUT;
// GPIO_Config(GPIOA, &gpioConfig);
// GPIO_SetBit(GPIOA, GPIO_PIN_4);
//
// /** config PIN_6 MISO*/
// gpioConfig.pin = GPIO_PIN_6;
// gpioConfig.mode = GPIO_MODE_AF;
// gpioConfig.pupd = GPIO_PUPD_PU;
// gpioConfig.speed = GPIO_SPEED_50MHz;
// GPIO_Config(GPIOA, &gpioConfig);
/** SPI RESET*/
SPI_Reset(SPI1);
SPI_ConfigStructInit(&spiConfig);
/** SPI configuration*/
spiConfig.polarity = SPI_CLKPOL_LOW;
spiConfig.direction = SPI_DIRECTION_1LINE_TX;/*单线 发送*/
spiConfig.mode = SPI_MODE_MASTER;/*主模式*/
spiConfig.phase = SPI_CLKPHA_1EDGE;
spiConfig.slaveSelect = SPI_SSC_ENABLE;
spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_64;
spiConfig.length = SPI_DATA_LENGHT_8B;
SPI1->CTRL1_B.ISS = SET;
SPI_Config(SPI1, &spiConfig);
SPI_Enable(SPI1);/*SPI使能*/
} -
-
主函数代码
-
int main(void)
{
APM_MINI_LEDInit(LED2);/*LED2 GPIOA_PIN_5 */
APM_MINI_LEDInit(LED3);/*LED2 GPIOA_PIN_6 */7
APM_MINI_SPIInit();
while(1)
{
SPI_TxData8(SPI1,0xAA);
Delay(0xff);
SPI_TxData8(SPI1,0x0A);
Delay(0xff);
APM_MINI_LEDToggle(LED2);
APM_MINI_LEDToggle(LED3);
GPIOA->DOUT ^= GPIO_PIN_4;
}
} -
-
测试结果:MISO,SCLK,CSS用做GPIO翻转测试正常,同时不影响SPI的MOSI输出数据。(除IO翻转外,验证了其他复用功能,都能正常使用)