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;
} 不能用:发送缓冲器为空作为标志。即使是:STM32也是一样的。
里面带有FIFO,发送为空:只是说明FIFO已经已开始发送,此时可以继续写FIFO。
你应该用:RXBNEF不为空。 发送缓冲器为空,不代表数据已经发送完,要控制CS,不能用这个位。
如果要硬件控制每个字节之间的CS拉高一次,我们的新型号有这个功能。 需要判断移位寄存器为空(如果有的话,这里只是表达意思),同样的串口也应该会有这类似的问题存在吧 本帖最后由 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]