4619 views|3 replies

931

Posts

3

Resources
The OP
 

Why can't SPI0i be enabled? [Copy link]

    I used the manufacturer's SPI example to test, but the program could not run. After checking line by line, I found that the program paused when it reached SPI0_enable. I could run past this line in the debugger in KEIL5, but it could not run past this line when downloaded to the board. Could you please tell me what the problem is? Program code: #include "gd32f3x0.h" #include "gd32f3x0_it.h" #include "GD32-Colibri-F350Rx.h" #define arraysize 10 uint32_t send_n = 0, receive_n = 0; uint8_t spi0_send_array[arraysize] = {0xA1, 0xA2, 0xA 3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA }; uint8_t spi1_receive_array[arraysize]; ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); void rcu_config(void); void gpio_config(void ); void spi_config(void); /*! \brief main function \param[in] none \param[out] none \retval none */ int main(void) { /* init led1 */ gd_eval_led_init (LED1); /* NVIC config */ nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3); nvic_irq_enable(SPI0_IRQn ,1,1); nvic_irq_enable(SPI1_IRQn,0,1); /* peripheral clock enable peripheral clock enable*/ rcu_config(); /* GPIO config */ gpio_config(); /* SPI config */ spi_config(); /* SPI int enable enable interrupt */ spi_i2s_interrupt_enable(SPI0, SPI_I2S_INT_TBE); spi_i2s_interrupt_enable(SPI1, SPI_I2S_INT_RBNE); /* SPI enable */ spi_enable(SPI1); spi_enable(SPI0); //Execution pause statement. I moved this line before spi_enable(SPI1), but it still didn't work. /* wait transmit complete*/ while(receive_n < arraysize); /* compare receive data with send data*/ if(memory_compare(spi1_receive_array, spi0_send_array, arraysize)) gd_eval_led_on(LED1); else gd_eval_led_off(LED1); while(1); } /*! \brief configure different peripheral clocks \param[in] none \param[out] none \retval none */ void rcu_config(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_SPI0); rcu_periph_clock_enable(RCU_SPI1); } /*! \brief configure the GPIO peripheral m[in] none \param[out] none \retval none */ void gpio_config(void) { /* SPI0 GPIO config: SCK/PA5, MOSI/PA7 */ gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_7); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_ 7); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); /* SPI1 GPIO config: SCK/PB13, MISO/PB14 */ gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13 | GPIO_PIN_14); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13 | GPIO_PIN_14); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14); } /*! \brief configure the SPI peripheral \ param[in] none \param[out] none \retval none */ void spi_config(void) { spi_parameter_struct spi_init_struct; /* SPI0 parameter config */ spi_init_struct.trans_mode = SPI_TRANSMODE_BDTRANSMIT; spi_init_struct.device_mode = SPI_MASTER;; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;; spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; spi_init_struct.nss = SPI_NSS_SOFT; spi_init_struct.prescale = SPI_PSC_8; spi_init_struct.endian = SPI_ENDIAN_MSB;; spi_init(SPI0, &spi_init_struct); /* SPI1 parameter config */ spi_init_struct.trans_mode = SPI_TRANSMODE_BDRECEIVE; spi_init_struct.device_mode = SPI_SLAVE; spi_init_struct.nss = SPI_NSS_SOFT; spi_init(SPI1, &spi_init_struct); } /*! \brief memory compare function \param[in] src : source data pointer \param[in] dst : destination data pointer \param[in] length : the compare data length \param[out] none \retval ErrStatus : ERROR or SUCCESS */ ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) { while (length--){ if (*src++ != *dst++) return ERROR; } return SUCCESS; }



This post is from GD32 MCU

Latest reply

Have you read the interrupt file gd32f3x0_it.c?  Details Published on 2018-9-20 13:59
 

931

Posts

3

Resources
2
 
    I am going to use SPI1 to receive data. I am going to receive an 8-byte string about once a minute, but I don't know how to write the receiving code. I would appreciate your help. In addition, when I tested the serial communication, I also don't know how to receive the string sent by the computer serial assistant.
This post is from GD32 MCU
 
 
 

5303

Posts

454

Resources
3
 
Have you read the interrupt file gd32f3x0_it.c?
This post is from GD32 MCU
 
 
 

931

Posts

3

Resources
4
 
Thanks for the tip! I just opened the file and read it. Do I need to first determine what kind of exception it is and then analyze and deal with it?
This post is from GD32 MCU
 
 
 

Find a datasheet?

EEWorld Datasheet Technical Support

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list