Ch32v307 spi問題

用了個官方spi1的例子,代碼如下,從分析儀可以看到clk和mosi,但是不知為什么spi_cs信號始終為低

另外自己寫了一個spi2的代碼,SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET 這個條件始終不能滿足,不知道是為什么

附件是spi1的時序圖,cs信號始終為低

-----------------spi1的測試例程---------------------------------

void Test1()

{

? ? u8 i;


? ? SystemCoreClockUpdate();

? ? Delay_Init();

? ? USART_Printf_Init(115200);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USART initialize

? ? printf("Test1\r\n");


? ? GPIO_InitTypeDef GPIO_InitStructure={0};

? ? SPI_InitTypeDef SPI_InitStructure={0};


? ? RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );


? ? //cs

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOA, &GPIO_InitStructure );


? ? //clk

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOA, &GPIO_InitStructure );


? ? //miso

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

? ? GPIO_Init(GPIOA, &GPIO_InitStructure );


? ? //mosi

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOA, &GPIO_InitStructure );


? ? SPI_SSOutputCmd( SPI1, ENABLE );

? ? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

? ? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

? ? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

? ? SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

? ? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

? ? SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

? ? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

? ? SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

? ? SPI_InitStructure.SPI_CRCPolynomial = 7;

? ? SPI_Init(SPI1, &SPI_InitStructure );


? ? SPI_Cmd(SPI1, ENABLE );


? ? i = 0;

? ? while (1)

? ? {

? ? ? ? while (i<100)

? ? ? ? {

? ? ? ? ? ? if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE ) != RESET )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Delay_Us(10);

? ? ? ? ? ? ? ? SPI_I2S_SendData(SPI1, i);

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? i = 0;

? ? }



}

spiTest1.png

-----------------spi2的測試例程---------------------------------

void Test2()

{

? ? u8 i;

? ? SystemCoreClockUpdate();

? ? Delay_Init();

? ? USART_Printf_Init(115200);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USART initialize


? ? printf("Test2\r\n");

? ? GPIO_InitTypeDef GPIO_InitStructure={0};

? ? SPI_InitTypeDef SPI_InitStructure={0};


? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB1Periph_SPI2, ENABLE);


? ? //cs

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure );


? ? //clk

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure );


? ? //miso

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;? //MISO

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure );


? ? //mosi

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure );


? ? SPI_SSOutputCmd(SPI2, ENABLE );


? ? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

? ? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

? ? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

? ? SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

? ? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

? ? SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

? ? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

? ? SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

? ? SPI_InitStructure.SPI_CRCPolynomial = 7;

? ? SPI_Init(SPI2, &SPI_InitStructure );


? ? SPI_Cmd(SPI2, ENABLE );


? ? i = 0;

? ? while (1)

? ? {

? ? ? ? while (i<100)

? ? ? ? {

? ? ? ? ? ? printf("get2\r\n");

? ? ? ? ? ? if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET )

? ? ? ? ? ? {//=========================================永遠進入不了這里,條件始終不能滿足

? ? ? ? ? ? ? ? SPI_I2S_SendData(SPI2, i);

? ? ? ? ? ? ? ? printf("send2\r\n");

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? }

? ? ? ? ? ? Delay_Ms(1000);

? ? ? ? }

? ? ? ? i = 0;

? ? }



}


您好,關于CS引腳拉低問題,SPI主從通信時,CS引腳拉低,選中設備開始進行通信,通信結束,CS引腳拉高。你這while循環(huán)中一直在進行通信,因此CS引腳為低電平。關于SPI2的測試,時鐘配置有問題,SPI2應該調用RCC_APB1PeriphClockCmd函數(shù)使能開啟SPI2時鐘。

image.png


http://www.findthetime.net/bbs/thread-106412-1.html

剛才看了這個帖子,感覺是用SPI_Cmd(SPI2, DISABLE );來結束通訊,這時候它就拉高了

等于spi是用這個enable和disable來控制片選了


只有登錄才能回復,可以選擇微信賬號登錄

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