用了個官方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;
? ? }
}
-----------------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;
? ? }
}