spiテスト自発自収(通信中断方式)

3538 ワード

1、spiクロックの初期化
void spiRccinit(void){  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

}
2、spiのGPIOピンを配置する
void spiGPIOInit(void){
    GPIO_InitTypeDef gpio_init;
    gpio_init.GPIO_Pin = GPIO_Pin_4; // 
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &gpio_init);

    gpio_init.GPIO_Pin = GPIO_Pin_5;  // 
    gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &gpio_init);

    gpio_init.GPIO_Pin = GPIO_Pin_7;  //MOSI 
    GPIO_Init(GPIOA, &gpio_init);

    gpio_init.GPIO_Pin = GPIO_Pin_6;  //MISO
    GPIO_Init(GPIOA, &gpio_init);

}3、構成してspiできるようにする
void spiConfigure(void){
    SPI_InitTypeDef spi_Init;
    spi_Init.SPI_CPHA = SPI_CPHA_2Edge;
    spi_Init.SPI_CPOL = SPI_CPOL_Low;
    spi_Init.SPI_DataSize = SPI_DataSize_8b;
    spi_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi_Init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi_Init.SPI_FirstBit = SPI_FirstBit_MSB;
    spi_Init.SPI_Mode = SPI_Mode_Master;
    spi_Init.SPI_NSS = SPI_NSS_Soft;
    spi_Init.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &spi_Init);  
    SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE); 
    SPI_Cmd(SPI1,ENABLE);

}4、構成spi割込み
void spiNivcConfiguration(void){
    NVIC_InitTypeDef nvic_init;     
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
    nvic_init.NVIC_IRQChannel = SPI1_IRQn;
    nvic_init.NVIC_IRQChannelPreemptionPriority = 2;
    nvic_init.NVIC_IRQChannelSubPriority = 1;
    nvic_init.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&nvic_init);

}5、割り込み処理関数の実現
void SPI1_IRQHandler(void){
    if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != RESET){
        if(send[++sendCount] != '\0'){
            SPI_I2S_SendData(SPI1, send[sendCount]);
        }
        else {      
            SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE, DISABLE);
        }
    }
    if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESET){
        recv[recvCount] = SPI_I2S_ReceiveData(SPI1);
        if(recv[recvCount] == '*'){
            recv[recvCount + 1] = '\0';
            printf("recv data: %s\r
", recv); recvCount = 0; } else { recvCount++; if(recvCount == 1023){ recvCount = 0; } } }

}注意:割り込み関数で使用される変数はすべてグローバル変数です.
u8 recv[1024] = {'\0'};
u8 send[1024] = {'\0'};
volatile u16 recvCount = 0;
volatile u16 sendCount = 0;

6、簡単な送信関数を実現する:
void spiWrite(const char *p){
    strcpy(send, p);
    sendCount = 0;
    //  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, send[sendCount]);
    SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE, ENABLE);
//  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
//  recv[0] = SPI_I2S_ReceiveData(SPI1);
//  recv[1] = '\0';
//  printf("recv ok! ");
//  printf(recv);
}

7、まとめ:
1、 stm32 datasheet spi 。
2、 spi ( )
3、 spi gpio 
4、 spi
5、 
6、 
7、 

8、残された問題:
     , SPI (SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE, DISABLE)),
 , sendCount , 。
 : stm32 SPI_I2S_ITConfig , spi 。