2014-03-03 12 views
0

here으로 지정된 ST7565 GLCD 라이브러리와 함께 작동하도록 SPI를 구성하려고합니다. 현재로서는 SPI1을 사용하여이 작업을 수행하려고합니다. 아래에 주어진 init 함수가 main()에서 호출되면 assert_failed 함수에서 프로그램을 반복합니다.STM32F4 SPI 구성 SPI_Init이 assert_failed 루프를 야기 함

SPI_Init(SPI1, &SPI_InitStruct); 

assert_failed 기능 (펌웨어 라이브러리 기본) 다음과 같습니다 : : 그것은() 라인 SPI_Init에 도달하면

void init_SPI1(void){ 

    GPIO_InitTypeDef GPIO_InitStruct; 
    SPI_InitTypeDef SPI_InitStruct; 

    // enable clock for used IO pins 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 

    /* configure pins used by SPI1 
    * PA5 = SCK 
    * PA6 = MISO 
    * PA7 = MOSI 
    */ 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_Init(GPIOA, &GPIO_InitStruct); 

    // connect SPI1 pins to SPI alternate function 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); 

    // enable clock for used IO pins 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 

    /* Configure the chip select pin 
     in this case we will use PE7 */ 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; 
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_Init(GPIOE, &GPIO_InitStruct); 

    GPIOE->BSRRL |= GPIO_Pin_7; // set PE7 high 

    // enable peripheral clock 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 

    /* configure SPI1 in Mode 0 
    * CPOL = 0 --> clock is low when idle 
    * CPHA = 0 --> data is sampled at the first edge 
    */ 
    SPI_InitStruct.SPI_Direction = SPI_Direction_1Line_Tx; // set to full duplex mode, seperate MOSI and MISO lines 
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;  // transmit in master mode, NSS pin has to be always high 
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide 
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;  // clock is low when idle 
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;  // data sampled at first edge 
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // set the NSS management to internal and pull internal NSS high 
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI frequency is APB2 frequency/4 
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first 

    SPI_Init(SPI1, &SPI_InitStruct); 
    SPI_Cmd(SPI1, ENABLE); // enable SPI1 
} 

나는 그 프로그램을 나타났습니다은 assert_failed 함수 내에서 무한 루프에 간다

void assert_failed(uint8_t* file, uint32_t line) 
{ 
    /* User can add his own implementation to report the file name and line number, 
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 

    /* Infinite loop */ 
    while (1) 
    { 

    } 
} 

나는 그것이 assert_failed 함수에서 반복된다는 것을 의미한다고 생각하지 않습니다. SPI 구성과 관련된 문제입니다. 문제를 이해하고 해결책을 제시하기위한 지침이 필요합니다. 어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다.

편집 : 나는 라이브러리가 고정되어 있기 때문에, 내가 살고 시계에서 디버깅하는 내부 아무 것도 입력에 도착하지 못할

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) 
{ 
    uint16_t tmpreg = 0; 

    /* check the parameters */ 
    assert_param(IS_SPI_ALL_PERIPH(SPIx)); 

    /* Check the SPI parameters */ 
    assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); 
    assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); 
    assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); 
    assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); 
    assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); 
    assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); 
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); 
    assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); 
    assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); 

stm32f4xx_spi.c

에 SPI_Init 기능의 내부 확인했습니다. (저는 IAR EWARM을 사용하고 있습니다)

답변

0

어설 션이 실패했기 때문에 assert()에서 반복됩니다. 따라서 루프가 더 이상 실행을 멈추게합니다.

주변 장치 라이브러리에서 어설 션이 실패했는지 확인할 수 있도록 스택에 단계적으로 올려 놓으십시오. 라이브러리는 매개 변수를 매우 광범위하게 검증하므로 호출 중 하나에서 잘못된 것이있을 수 있습니다.

업데이트CRCPolynomial 필드를 초기화하지 않는 것 같습니다. 단언 할 수 있습니다. SPI_StructInit()에 대한 호출을 추가하여 init 구조체가 초기화되었는지 확인한 다음 응용 프로그램의 필요에 따라 초기화를 시작하십시오.

+0

제발 내 편집을 확인하십시오. – mozcelikors

+0

나는 그것을 점검 할 것이다. – mozcelikors