zhcj66 发表于 2023-12-7 11:23:53

apm32f003 SPI的发送状态寄存器 有bug吗

本帖最后由 zhcj66 于 2023-12-7 11:26 编辑

使用apm32f003 SPI做为 主 发送数据,软件控制cs,

监测spi 状态寄存器的发送,发送完毕后 软件 失能(拉高)cs,

通过逻辑分析发现, spi还未发送完数据,就失能cs了, 而且多次发送几组数据,规律还一致,

不知道什么原因造成的,难道他的状态寄存器有bug?

通过软件模拟spi是正常的(已点亮屏)

#define df_LCD_CS_GPIO                        GPIOB
#define df_LCD_CS_PIN                        GPIO_PIN_4
#define df_LCD_CS_Clr()   GPIO_ClearBit(df_LCD_CS_GPIO,df_LCD_CS_PIN)//CS
#define df_LCD_CS_Set()   GPIO_SetBit(df_LCD_CS_GPIO,df_LCD_CS_PIN)
void LCD_Writ_Bus(unsigned char dat){       
unsigned char i;
        df_LCD_CS_Clr();
        while(SPI_ReadStatusFlag(SPI_FLAG_TXBE) == RESET){}
    SPI_TxData(dat);
        while(SPI_ReadStatusFlag(SPI_FLAG_TXBE) == RESET){}
        df_LCD_CS_Set();       
}

int main(void){
GPIO_Config_T gpioConfig;

    gpioConfig.mode = GPIO_MODE_OUT_PP;
    gpioConfig.speed = GPIO_SPEED_10MHz;       
    gpioConfig.pin = df_LCD_CS_PIN;
    GPIO_Config(df_LCD_CS_GPIO, &gpioConfig);

    APM_DelayInit(APM_DELAY_MS);

    SPI_Init();       
       
    while(1){
                LCD_Writ_Bus(0xa5);
                LCD_Writ_Bus(0xe7);
                LCD_Writ_Bus(0x7e);
      APM_Delay(10);
    }
}


//一下是厂家提供的库
uint8_t SPI_ReadStatusFlag(uint8_t flag)
{
    uint8_t status;

    status = (uint8_t)(SPI->STS & flag);

    if(status == flag)
    {
      return SET;
    }

    return RESET;
}

void SPI_TxData(uint8_t data)
{
    SPI->DATA = (uint32_t)data;
}

SUPER_CRJ 发表于 2023-12-7 16:27:54

不能用:发送缓冲器为空作为标志。即使是:STM32也是一样的。
里面带有FIFO,发送为空:只是说明FIFO已经已开始发送,此时可以继续写FIFO。
你应该用:RXBNEF不为空。

fcm32 发表于 2023-12-8 09:16:14

发送缓冲器为空,不代表数据已经发送完,要控制CS,不能用这个位。

如果要硬件控制每个字节之间的CS拉高一次,我们的新型号有这个功能。

1a2b3c 发表于 2023-12-8 09:56:39

需要判断移位寄存器为空(如果有的话,这里只是表达意思),同样的串口也应该会有这类似的问题存在吧

zhcj66 发表于 2023-12-8 11:56:20

本帖最后由 zhcj66 于 2023-12-8 12:39 编辑

SUPER_CRJ 发表于 2023-12-7 16:27
不能用:发送缓冲器为空作为标志。即使是:STM32也是一样的。
里面带有FIFO,发送为空:只是说明FIFO已经已 ...
(引用自2楼)

感谢提供思路 ,RXBNEF不可以,但是使用 BUSYF就ok了

后面的while改成 while(SPI_ReadStatusFlag(SPI_FLAG_BUSY) != RESET){}

当spi空闲的时候就可以再发送下个数据了

页: [1]
查看完整版本: apm32f003 SPI的发送状态寄存器 有bug吗