SPI通讯收不到数据主机代码
#include "gd32a490.h"
#include "SPI.h"
#define SPI_CRC_ENABLE 0
#define ARRAYSIZE 16
uint16_t spi1_send_array[ARRAYSIZE] = {0};
uint16_t spi1_receive_array[ARRAYSIZE] = {0};;
extern uint16_t i2s1_rxbuffer[ARRAYSIZE];
void spi_rcu_config(void);
void spi_gpio_config(void);
void dma_config(void);
void spi_config(void);
void SPI_Init(void)
{
/* configure RCU */
spi_rcu_config();
/* configure GPIO */
dma_config();
/* configure I2C */
spi_config();
dma_interrupt_enable(DMA1, DMA_CH3,DMA_CHXCTL_FTFIE);
nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
nvic_irq_enable(DMA1_Channel3_IRQn, 0, 1);
// /* enable SPI DMA */
spi_dma_enable(SPI4, SPI_DMA_RECEIVE);
spi_dma_enable(SPI4, SPI_DMA_TRANSMIT);
/* enbale I2S and I2S_ADD*/
spi_enable(SPI4);
dma_channel_enable(DMA1, DMA_CH4);
dma_channel_enable(DMA1, DMA_CH3);
}
void spi_rcu_config(void)
{
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_DMA1);
rcu_periph_clock_enable(RCU_SPI4);
}
/*!
\brief configure the GPIO peripheral
\param[in] none
\param[out] none
\retval none
*/
void spi_gpio_config(void)
{
/* configure SPI1 GPIO */
gpio_af_set(GPIOE, GPIO_AF_6, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14);
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14);
/* set SPI1_NSS as GPIO*/
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void dma_config(void)
{
dma_single_data_parameter_struct dma_init_struct;
/* configure SPI1 transmit dma */
dma_deinit(DMA1, DMA_CH4);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4);
dma_init_struct.memory0_addr = (uint32_t)spi1_send_array;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_LOW;
dma_init_struct.number = ARRAYSIZE;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE;
dma_single_data_mode_init(DMA1, DMA_CH4, &dma_init_struct);
dma_channel_subperipheral_select(DMA1, DMA_CH4, DMA_SUBPERI2);
/* configure SPI1 receive dma */
dma_deinit(DMA1, DMA_CH3);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4);
dma_init_struct.memory0_addr = (uint32_t)spi1_receive_array;
dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.number = ARRAYSIZE;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE;
dma_single_data_mode_init(DMA1, DMA_CH3, &dma_init_struct);
dma_channel_subperipheral_select(DMA1, DMA_CH3, DMA_SUBPERI2);
}
/*!
\brief configure the SPI peripheral
\param[in] none
\param[out] none
\retval none
*/
void spi_config(void)
{
spi_parameter_struct spi_init_struct;
spi_i2s_deinit(SPI4);
/* configure SPI1 parameter */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_HARD;
spi_init_struct.prescale = SPI_PSC_16;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI4, &spi_init_struct);
spi_nss_output_enable(SPI4);
spi_nss_internal_low(SPI4);
#if SPI_CRC_ENABLE
/* configure SPI CRC function */
spi_crc_polynomial_set(SPI1, 7);
spi_crc_on(SPI1);
#endif /* enable CRC function */
}
从机代码
#include "gd32a490.h"
#include "SPI.h"
#define SPI_CRC_ENABLE 0
#define ARRAYSIZE 16
uint16_t spi1_send_array[ARRAYSIZE] = {0};
uint16_t spi1_receive_array[ARRAYSIZE] = {0};;
extern uint16_t i2s1_rxbuffer[ARRAYSIZE];
void spi_rcu_config(void);
void spi_gpio_config(void);
void dma_config(void);
void spi_config(void);
void SPI_Init(void)
{
/* configure RCU */
spi_rcu_config();
/* configure GPIO */
dma_config();
/* configure I2C */
spi_config();
/
dma_interrupt_enable(DMA1, DMA_CH3,DMA_CHXCTL_FTFIE);
nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
nvic_irq_enable(DMA1_Channel3_IRQn, 0, 1);
// /* enable SPI DMA */
spi_dma_enable(SPI4, SPI_DMA_RECEIVE);
spi_dma_enable(SPI4, SPI_DMA_TRANSMIT);
spi_enable(SPI4);
dma_channel_enable(DMA1, DMA_CH4);
dma_channel_enable(DMA1, DMA_CH3);
//
}
void spi_rcu_config(void)
{
// rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_DMA1);
rcu_periph_clock_enable(RCU_SPI4);
}
/*!
\brief configure the GPIO peripheral
\param[in] none
\param[out] none
\retval none
*/
void spi_gpio_config(void)
{
/* configure SPI1 GPIO */
gpio_af_set(GPIOE, GPIO_AF_6, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13);
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE , GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13);
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void dma_config(void)
{
dma_single_data_parameter_struct dma_init_struct;
/* configure SPI1 transmit dma */
dma_deinit(DMA1, DMA_CH4);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4);
dma_init_struct.memory0_addr = (uint32_t)spi1_send_array;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_LOW;
dma_init_struct.number = ARRAYSIZE;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE;
dma_single_data_mode_init(DMA1, DMA_CH4, &dma_init_struct);
dma_channel_subperipheral_select(DMA1, DMA_CH4, DMA_SUBPERI2);
/* configure SPI1 receive dma */
dma_deinit(DMA1, DMA_CH3);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4);
dma_init_struct.memory0_addr = (uint32_t)spi1_receive_array;
dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.number = ARRAYSIZE;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE;
dma_single_data_mode_init(DMA1, DMA_CH3, &dma_init_struct);
dma_channel_subperipheral_select(DMA1, DMA_CH3, DMA_SUBPERI2);
}
/*!
\brief configure the SPI peripheral
\param[in] none
\param[out] none
\retval none
*/
void spi_config(void)
{
spi_parameter_struct spi_init_struct;
spi_i2s_deinit(SPI4);
/* configure SPI1 parameter */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_SLAVE;
spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_HARD;
spi_init_struct.prescale = SPI_PSC_16;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI4, &spi_init_struct);
#if SPI_CRC_ENABLE
/* configure SPI CRC function */
spi_crc_polynomial_set(SPI1, 7);
spi_crc_on(SPI1);
#endif /* enable CRC function */
}
|