GD32 F405 SPI读取三轴lis2dw12tr设备ID失败

问题: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);
      
}

GD32F405是一款高性能的MCU,支持多种外设,包括SPI模块。要配置SPI的时钟速率,可以使用SPI_BR寄存器,该寄存器的值决定了SPI时钟速率,其计算公式为: SPI时钟速率 = 外设时钟频率 / (分频系数 × (1 + 规定的待机时间)) 下面提供两种不同的方法来配置SPI速率: 1.使用库函数来配置SPI速率 ```c #include "gd32f4xx.h" void spi_init(void) { /* 使能 SPI 外设时钟 */ rcu_periph_clock_enable(RCU_SPI0); /* 配置 SPI 相关 IO 口 */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); /* 配置 SPI 参数 */ spi_parameter_struct spi_init_struct; spi_i2s_deinit(SPI0); spi_struct_para_init(&spi_init_struct); spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; spi_init_struct.nss = SPI_NSS_SOFT; spi_init_struct.prescale = SPI_PSC_256; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI0, &spi_init_struct); /* 使能 SPI */ spi_enable(SPI0); } int main(void) { spi_init(); return 0; } ``` SPI_PSC_256表示SPI时钟源频率的分频系数为256,可以根据具体需要进行调整。 2.直接使用寄存器来配置SPI速率 ```c #include "gd32f4xx.h" void spi_init(void) { /* 使能 SPI 外设时钟 */ rcu_periph_clock_enable(RCU_SPI0); /* 配置 SPI 相关 IO 口 */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); /* 配置 SPI 参数 */ SPI_CTL0(SPI0) &= ~(SPI_CTL0_BIDIMODE | SPI_CTL0_BIDIOE | SPI_CTL0_CRCEN); SPI_CTL0(SPI0) |= SPI_CTL0_SWNSS | SPI_CTL0_MSTMOD; SPI_CTL0(SPI0) |= SPI_CTL0_CKPL | SPI_CTL0_CKPH; SPI_CTL0(SPI0) &= ~SPI_CTL0_LSBFE; SPI_CFG(SPI0) = SPI_CFG_MASTER | SPI_CFG_MANUALNSS | SPI_CFG_NSSSEL | SPI_CFG_FRAME8BIT; SPI_BR(SPI0) = SPI_PSC_256; /* 使能 SPI */ SPI_CTL0(SPI0) |= SPI_CTL0_SPIEN; } int main(void) { spi_init(); return 0; } ``` SPI_PSC_256表示SPI时钟源频率的分频系数为256,可以根据具体需要进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值