问题:GD32 F405 SPI读取三轴lis2dw12tr设备ID失败,示波器抓spi波形也有,但是读取到的设备ID一直在变化。
解决:后来将SPI读取过程发送完寄存器地址读一个字节,然后再发送一个无效地址再读一次就设备ID就读对了,测试了很多次一直读都没问题。具体看代码:
SPI配置:
void spi1_config(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_SPI1);
spi_parameter_struct spi_init_struct;
spi_i2s_deinit(SPI1);
/* configure SPI1 GPIO */
gpio_af_set(GPIOB, GPIO_AF_5,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
/* set SPI1_NSS as GPIO*/
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
/* 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_8BIT;
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_8;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI1, &spi_init_struct);
spi_enable(SPI1);
delay_1ms(100);
}
//.lis2dw12tr读取设备ID函数
#define REG_CARD_ID 0x0F ///<The chip id
uint8_t DFRobot_LIS2DW12_getID(){
uint8_t identifier;
readReg(REG_CARD_ID,&identifier,1);
return identifier;
}
void readReg(uint8_t reg,uint8_t * pBuf ,uint8_t size)
{
static uint16_t temp = 0;
reg |= 0x80;
gpio_bit_reset(GPIOA, GPIO_PIN_4);
delay_1ms(100);
//.发送要读取的寄存器地址再读一个字节
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
spi_i2s_data_transmit(SPI0, reg);
while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
temp = spi_i2s_data_receive(SPI0);
while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));
//.发送一个无效数据再读有效数据
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
spi_i2s_data_transmit(SPI0, 0);
while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
temp = spi_i2s_data_receive(SPI0);
while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));
gpio_bit_set(GPIOA, GPIO_PIN_4);
*pBuf = temp;
printf("<WCGU> main - SPI1_ReadWrite :%d-%02x\r\n",temp,reg);
}