|
在代码中进行spi0与spi1的单工传输,为什么运行后收到的数据与发送的数据不一致
引脚:spi0 SCK/PA5, MISO/PA6, MOSI/PA7,NSS/PA4 SPI1 SCK/PB13, MISO/PB14, MOSI/PB15 NSS/PB12
大致代码如下:
#define SLVAE_TRANSMIT_MASTER_RECEIVE
#define SET_SPI1_NSS_HIGH gpio_bit_set(GPIOB,GPIO_PIN_12);
#define SET_SPI1_NSS_LOW gpio_bit_reset(GPIOB,GPIO_PIN_12);
#define NUM 10
uint8_t spi0_send_array[NUM] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA};
uint8_t spi1_send_array[NUM] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA};
uint8_t spi0_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};
uint8_t spi1_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};
int main(void)
{
rcu_config();
led_init();
gpio_config();
SET_SPI1_NSS_HIGH
spi_config();
dma_config();
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
dma_channel_enable(DMA0, DMA_CH1);
dma_channel_enable(DMA0, DMA_CH4);
spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
spi_dma_enable(SPI0, SPI_DMA_RECEIVE);
#endif
spi_enable(SPI0);
spi_enable(SPI1);
SET_SPI1_NSS_LOW
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
while(!dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF));
while(!dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF));
if(ERROR !=memory_compare(spi0_receive_array, spi1_send_array, NUM))
gpio_bit_reset(GPIOA, GPIO_PIN_1);
else
gpio_bit_set(GPIOA, GPIO_PIN_1);
#endif
SET_SPI1_NSS_HIGH
spi_disable(SPI1);
spi_disable(SPI0);
while(1) ;
return 0;
}
void led_init(void)
{
gpio_bit_set(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
}
void rcu_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_DMA0);
rcu_periph_clock_enable(RCU_SPI0);
rcu_periph_clock_enable(RCU_SPI1);
}
void gpio_config(void)
{
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
}
void spi_config(void)
{
spi_parameter_struct spi_init_struct;
spi_i2s_deinit(SPI0);
spi_i2s_deinit(SPI1);
spi_struct_para_init(&spi_init_struct);
#ifdef MASTER_TRANSMIT_SLVAE_RECEIVE
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
#endif
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
spi_init_struct.trans_mode = SPI_TRANSMODE_RECEIVEONLY;
#endif
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_16;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI0, &spi_init_struct);
#ifdef MASTER_TRANSMIT_SLVAE_RECEIVE
spi_init_struct.trans_mode = SPI_TRANSMODE_RECEIVEONLY;
#endif
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
#endif
spi_init_struct.device_mode = SPI_SLAVE;
spi_init_struct.nss = SPI_NSS_HARD;
//spi_init_struct.nss = SPI_NSS_SOFT;//FULL
spi_init(SPI1, &spi_init_struct);
}
void dma_config(void)
{
dma_parameter_struct dma_init_struct;
dma_deinit(DMA0, DMA_CH2);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
dma_init_struct.memory_addr = (uint32_t)spi0_send_array;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_LOW;
dma_init_struct.number = NUM;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init(DMA0, DMA_CH2, &dma_init_struct);
dma_circulation_disable(DMA0, DMA_CH2);
dma_memory_to_memory_disable(DMA0, DMA_CH2);
dma_deinit(DMA0, DMA_CH1);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
dma_init_struct.memory_addr = (uint32_t)spi0_receive_array;
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init(DMA0, DMA_CH1, &dma_init_struct);
dma_circulation_disable(DMA0, DMA_CH1);
dma_memory_to_memory_disable(DMA0, DMA_CH1);
dma_deinit(DMA0, DMA_CH4);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);
dma_init_struct.memory_addr = (uint32_t)spi1_send_array;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init(DMA0, DMA_CH4, &dma_init_struct);
dma_circulation_disable(DMA0, DMA_CH4);
dma_memory_to_memory_disable(DMA0, DMA_CH4);
dma_deinit(DMA0, DMA_CH3);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);
dma_init_struct.memory_addr = (uint32_t)spi1_receive_array;
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH3, &dma_init_struct);
dma_circulation_disable(DMA0, DMA_CH3);
dma_memory_to_memory_disable(DMA0, DMA_CH3);
}
ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length)
{
while(length--)
{
if(*src++ != *dst++)
return ERROR;
}
return SUCCESS;
}

|
|