正点原子STEMWIN死机

在用正点原子STM32F4开发板,搭配对应的button历程时,发现运行一会,button都无法使用了,以为是emwin死机了,但是看到Led还在闪烁,排除系统死机问题。那就是emwin的任务没有运行起来,但是打断点后,仍然可以进入,说明任务也没问题。接着又添加了txt控件,不停的更新显示。这才发现,button不可以可能是触摸屏有问题。在出现问题时,触摸屏那里读取的mode都是0和ff。正常的应该是0x80之类的。 所以基本判定是触摸驱动的问题。然后处理结果如下:

我发现GT9147_RD_Reg(GT_GSTID_REG,&mode,1),没有触点时,多次能读到0xFF(当然还有别的异常值)。用示波器跟踪发现STM32F407发送0x28,GT9147竟然没有ACK。整个波形全是乱的。在CTIIC.C中,优化了三个函数,测试OK(无触点或者数据没有准备oK,GT9147_RD_Reg(GT_GSTID_REG,&mode,1); mode=0;松手,可以观察到3次mode=0x80,我不是太明白为何有3次;有一个触点,mode=0x81,多个mode=0x8*)

应该是从侧先ACK,后有主侧SCL变高电平,优化之
u8 CT_IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
    CT_SDA_IN();      //SDA设置为输入  
    CT_IIC_SCL=0;
    delay_us(2);
    while(CT_READ_SDA)
    {
        ucErrTime++;
        delay_us(2);   
        if(ucErrTime>250)
        {
            CT_IIC_Stop();
            return 1;
        }
    }
    delay_us(2);
    CT_IIC_SCL=1;
    delay_us(2);   
    CT_IIC_SCL=0;
  delay_us(3);   
    return 0;  
}
增加SDA到SCL之间的延时,解决发地址没有ACK问题
void CT_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    CT_SDA_OUT();         
    CT_IIC_SCL=0;//拉低时钟开始数据传输
    CT_Delay();
    for(t=0;t<8;t++)
    {              
        CT_IIC_SDA=(txd&0x80)>>7;
        txd<<=1;
    delay_us(2);//pnhhit            
        CT_IIC_SCL=1;
        CT_Delay();
        CT_IIC_SCL=0;   
        CT_Delay();
    }     
}   
读数据延时放大,100us,是我大致放大,可以在细化 ,比如50us      
u8 CT_IIC_Read_Byte(unsigned char ack)
{
    u8 i,receive=0;
     CT_SDA_IN();//SDA设置为输入
    //delay_us(30);//pnhhit  这个相对myiic.c文件是正点原子他们自己加的,但是我测试还是不够长
    delay_us(100);
    for(i=0;i<8;i++ )
    {
        CT_IIC_SCL=0;               
        CT_Delay();
        CT_IIC_SCL=1;     
        receive<<=1;
        if(CT_READ_SDA)receive++;
    delay_us(1);//pnhhit        
    }                       
    if (!ack)CT_IIC_NAck();//发送nACK
    else CT_IIC_Ack(); //发送ACK   
     return receive;
}

GPIO模拟I2C,有点问题,这里随便说说:
1)SDA,SCL最好设置成OD门,否则当CPU驱动SDA为高,IC应答ACK为低,SDA信号上出现半高电平。
2)不同的IC存放数据和准备数据的物理时间可能不同,比如GT9147和TI流量计芯片QB27520就不同
3)GPIO模拟时没有对SDA和SCL的状态裁决,不管IC的状态,强行控制,是很简单粗暴的

哎,正点原子的例程不能随意放到项目中用,问题太多,不稳定。

你可能感兴趣的:(GUI,stm32,单片机,stm32,物联网)