CH32V307的SPI單線發(fā)送波形異常

使用ch32v307的spi2做單線發(fā)送使用,發(fā)現(xiàn)軟件cs波形在sck還沒結(jié)束就提前變高了,感覺不正常


我在SPI_I2S_SendData之后while等待TXE和BUSY信號(hào),等到他們都有效以后才退出發(fā)送函數(shù),從現(xiàn)象上來看數(shù)據(jù)還沒發(fā)完BUSY信號(hào)就已經(jīng)有效了,這個(gè)BUSY信號(hào)不應(yīng)該是發(fā)完數(shù)據(jù)以后才會(huì)有效嗎?


請(qǐng)問如何解決這個(gè)問題?


這是波形圖

image.png


初始化和發(fā)送代碼是這樣的

void?bsp_spi_config(void)
{
????GPIO_InitTypeDef?gpio_init_struct?=?{0};

????SPI_APBxClock_FUN(SPI_CLK,?ENABLE);
????SPI_CS_APBxClock_FUN(SPI_CS_CLK,?ENABLE);
????SPI_SCK_APBxClock_FUN(SPI_SCK_CLK,?ENABLE);
????SPI_MOSI_APBxClock_FUN(SPI_MOSI_CLK,?ENABLE);

????gpio_init_struct.GPIO_Speed?=?GPIO_Speed_50MHz;
????/*?SCK?*/
????gpio_init_struct.GPIO_Mode?=?GPIO_Mode_AF_PP;
????gpio_init_struct.GPIO_Pin?=?SPI_SCK_PIN;
????GPIO_Init(SPI_SCK_PORT,?&gpio_init_struct);

????/*?MOSI?*/
????gpio_init_struct.GPIO_Mode?=?GPIO_Mode_AF_PP;
????gpio_init_struct.GPIO_Pin?=?SPI_MOSI_PIN;
????GPIO_Init(SPI_MOSI_PORT,?&gpio_init_struct);

????/*?CS?*/
????gpio_init_struct.GPIO_Mode?=?GPIO_Mode_Out_PP;
????gpio_init_struct.GPIO_Pin?=?SPI_CS_PIN;
????GPIO_Init(SPI_CS_PORT,?&gpio_init_struct);

????spi_init_struct.SPI_Direction?=?SPI_Direction_1Line_Tx;
????spi_init_struct.SPI_Mode?=?SPI_Mode_Master;
????spi_init_struct.SPI_DataSize?=?SPI_DataSize_8b;
????spi_init_struct.SPI_CPOL?=?SPI_CPOL_High;
????spi_init_struct.SPI_CPHA?=?SPI_CPHA_2Edge;
????spi_init_struct.SPI_NSS?=?SPI_NSS_Soft;
????spi_init_struct.SPI_BaudRatePrescaler?=?SPI_BaudRatePrescaler_8;
????spi_init_struct.SPI_FirstBit?=?SPI_FirstBit_MSB;
????spi_init_struct.SPI_CRCPolynomial?=?7;
????SPI_Init(SPIx,?&spi_init_struct);

????/*?使能?SPI??*/
????SPI_Cmd(SPIx,?ENABLE);
}

void?bsp_spi_transmit(uint16_t?byte)
{
????SPI_I2S_SendData(SPIx,?byte);
????while((SPI2->STATR?&?SPI_I2S_FLAG_TXE)?==?RESET);
????while((SPI2->STATR?&?SPI_I2S_FLAG_BSY)?==?SET);
}

int?main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);
	printf("SystemClk:%d\r\n",SystemCoreClock);
	printf(?"ChipID:%08x\r\n",?DBGMCU_GetCHIPID()?);
	printf("This?is?printf?example\r\n");

	bsp_spi_config();
????while(1)
????{
????????SPI_CS_LOW();
????????bsp_spi_transmit(0xaa);
????????bsp_spi_transmit(0xaa);
????????bsp_spi_transmit(0xaa);
????????bsp_spi_transmit(0xaa);
????????SPI_CS_HIGH();
????????Delay_Ms(1);
????}
}



您好,如下圖,按照我的理解,發(fā)送時(shí)要經(jīng)過一個(gè)移位寄存器,無(wú)論是TXE還是BSY,應(yīng)該都只是對(duì)Tx buffer的判斷,當(dāng)Tx buffer為空時(shí),標(biāo)志位生效,但數(shù)據(jù)的傳輸還要經(jīng)過移位寄存器,因此CS被拉高之后還會(huì)有一段數(shù)據(jù)在傳輸,可以在拉高之前加個(gè)2us左右延時(shí)試一下。

image.png


喔喔這樣啊,那我抽空試試


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频