我的项目要从上位机接收水位数据再进行处理,现在项目进度卡在了数据接收上,上位机是用51芯片,通过串口助手已经可以收到51单片机发送的数据,另外还通过SPI发送数据,用逻辑分析仪观看到正确的时序图(参见下图)。上位机发送的是9个字节的数据,包含两个各三位数的ASCII字符。
我首先调试串口,串口助手可以收到GD32发出的信息,但GD32一直接收不到串口助手发出的信息,由于我刚学32位单片机,从厂家提供的范例中看不出是如何接收数据的。
随后我又准备通过SPI1来接收,按照范例及参照其他坛友的帖子,反复调试也是无法接收到数据。
最后我直接设置引脚、写代码来接收SPI数据,调试了几天仍无结果。请各位帮忙看看我的代码是什么问题,若能提供串口接收和SPI1接口的范例也感谢不尽。
GPIO配置代码:
void gpio_config(void) //GPIO配置SP0(GPIOA),SPI1(GPIOB)和SOFT_SPI(GPIOC)
{
/* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_SPI0);
gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
/* SPI1 GPIO config: SCK/PB13, MISO/PB14, MOSI/PB15 */
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_SPI1);
gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
//配置soft spi:SL_CS/PC13, SL_MISO/PC12, SL_MOSI/PC11, SL_CLK/PC10
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_10 |GPIO_PIN_11 | GPIO_PIN_13 );
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 );
}
SPI配置程序:
void spi_config(void)
{
spi_parameter_struct spi_init_struct;
/* SPI0 parameter config */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; //全双工
spi_init_struct.device_mode = SPI_MASTER; //主设备
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; //帧大小为8位
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);
}
软件读入SPI:
uint8_t soft_spi_read(void) //软件编程读SPI1
{
uint8_t i,j, dat;
while (gpio_input_bit_get(GPIOC,GPIO_PIN_13) == SET) //高电平时循环等待片选信号
{
if (gpio_input_bit_get(GPIOC,GPIO_PIN_13) == RESET) //低电平时开始接收数据
{
for (j=0; j<9; j++) //接收9个字节数据
{
for (i=0; i<8; i++) //读入8位(1个字节)
{
while(gpio_input_bit_get(GPIOC,GPIO_PIN_10) == RESET);//PC10引脚CLK低电平时循环
if (gpio_input_bit_get(GPIOC,GPIO_PIN_11) == SET) //PC11引脚MOSI
{
dat = dat + 1;
}
dat <<= 1;
while(gpio_input_bit_get(GPIOB,GPIO_PIN_10) == SET); //PC10引脚CLK高电平时循环
} //1字节读取完成
receiver_buffer[j] = dat;
} //块(9字节)读取完成
return RESET; //接收完毕,返回正确标志
}
}
return SET;
}
main函数中调用:
if (soft_spi_read() == RESET) //调取SPI读数据模块
{
display_abnormal(); //读到数据
}
else
{
display_wait(); //未读到数据
} |
|