求助,我画的板子没EEPROM,想把电阻屏的校准值写到外部flash里面,怎么做?

2019-07-20 22:20发布

改了之后存不了,没有写入flash
EEPROM 的代码
s32 temp;       
temp=tp_dev.xfac*100000000;   
AT24CXX_WriteLenByte(SAVE_ADDR_BASE,temp,4);

改了后,用flash
s32 temp;       
temp=tp_dev.xfac*100000000;   
W25QXX_Write((u8*)temp,SAVE_ADDR_BASE,4);

flash写数据的函数是这个
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);
数据写入是u8* pBuffer,而temp的数据类型是s32,所以肯定不对,那么该怎么改呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
FantaSy_
1楼-- · 2019-07-21 00:35
参考下原子的外部flash的历程吧!!
zdfwyh
2楼-- · 2019-07-21 02:59
本帖最后由 zdfwyh 于 2016-5-10 17:15 编辑

其实你做的已经很接近真相了,U32可以保存在Flash中,对于Flash来说只有数据没有类型之分.只是temp是U32转换为U8*要用&操作符,即(u8*)&temp,代码如下,长度为4,另外注意一下SAVE_ADDR_BASE地址就行了

s32 temp;        
temp=tp_dev.xfac*100000000;   
W25QXX_Write((u8*)&temp,SAVE_ADDR_BASE,4);
马德里骑士
3楼-- · 2019-07-21 07:43
zdfwyh 发表于 2016-5-10 17:12
其实你做的已经很接近真相了,U32可以保存在Flash中,对于Flash来说只有数据没有类型之分.只是temp是U32转换 ...

我改成了这样可以了
//////////////////////////////////////////////////////////////////////////         

#define SAVE_ADDR_BASE 16*1024*1024-100
                                                                            
void TP_Save_Adjdata(void)
{
        s32 temp;       
        u8 pBuffer[10];
        int i;
        //±£′æD£Õy½á1û!                                                                             
        temp=tp_dev.xfac*100000000;//±£′æxD£ÕyòòËØ
        for(i=3;i>=0;i--)
        {
   pBuffer=temp&0x000000ff;       
         temp>>=8;                 
        }
  W25QXX_Write(pBuffer,SAVE_ADDR_BASE,4);
   
        temp=tp_dev.yfac*100000000;//±£′æyD£ÕyòòËØ  
  for(i=3;i>=0;i--)
        {
   pBuffer=temp&0x000000ff;       
         temp>>=8;          
        }
        W25QXX_Write(pBuffer,SAVE_ADDR_BASE+4,4);  
        //±£′æxÆ«òÆá¿
         for(i=1;i>=0;i--)
        {
   pBuffer=tp_dev.xoff&0x00ff;
         tp_dev.xoff>>=8;          
        }
          W25QXX_Write(pBuffer,SAVE_ADDR_BASE+8,2);             
        //±£′æyÆ«òÆá¿
        for(i=1;i>=0;i--)
        {
   pBuffer=tp_dev.yoff&0x00ff;
         tp_dev.yoff>>=8;          
        }
        W25QXX_Write(pBuffer,SAVE_ADDR_BASE+10,2);
        pBuffer[0]=tp_dev.touchtype;
        W25QXX_Write(pBuffer,SAVE_ADDR_BASE+12,1);
       
        pBuffer[0]=0X0A;//±ê¼ÇD£×¼1yáË
        W25QXX_Write(pBuffer,SAVE_ADDR_BASE+13,1);
       
}
//μÃμ½±£′æÔúEEPROMàïÃæμÄD£×¼Öμ
//·μ»ØÖμ£o1£¬3é1|»ñè¡êy¾Y
//        0£¬»ñè¡ê§°ü£¬òaÖØDÂD£×¼
u8 TP_Get_Adjdata(void)
{                                          
        s32 tempfac;
        u8 pBuffer[10];
       
        W25QXX_Read(pBuffer,SAVE_ADDR_BASE+13,1);
        tempfac=pBuffer[0];
         
        if(pBuffer[0]==0X0A)//′¥ÃtÆáòѾ-D£×¼1yáË                          
        {   
    W25QXX_Read(pBuffer,SAVE_ADDR_BASE,4);
    tempfac=(pBuffer[0]<<24)+(pBuffer[1]<<16)+(pBuffer[2]<<8)+pBuffer[3];                                       
                tp_dev.xfac=(float)tempfac/100000000;//μ&#195;μ&#189;xD£×&#188;2&#206;êy
                               
                W25QXX_Read(pBuffer,SAVE_ADDR_BASE+4,4);
                tempfac=(pBuffer[0]<<24)+(pBuffer[1]<<16)+(pBuffer[2]<<8)+pBuffer[3];                                  
                tp_dev.yfac=(float)tempfac/100000000;//μ&#195;μ&#189;yD£×&#188;2&#206;êy
            //μ&#195;μ&#189;x&#198;&#171;ò&#198;á&#191;               
                W25QXX_Read(pBuffer,SAVE_ADDR_BASE+8,2);
                tp_dev.xoff=(pBuffer[0]<<8)+pBuffer[1];                             
            //μ&#195;μ&#189;y&#198;&#171;ò&#198;á&#191;                   
                W25QXX_Read(pBuffer,SAVE_ADDR_BASE+10,2);
                tp_dev.xoff=(pBuffer[0]<<8)+pBuffer[1];
    W25QXX_Read(pBuffer,SAVE_ADDR_BASE+12,1);
    tp_dev.touchtype=pBuffer[0];               
                if(tp_dev.touchtype)//X,Y·&#189;&#207;òó&#235;&#198;á&#196;&#187;&#207;à·′
                {
                        CMD_RDX=0X90;
                        CMD_RDY=0XD0;         
                }else                                   //X,Y·&#189;&#207;òó&#235;&#198;á&#196;&#187;&#207;àí&#172;
                {
                        CMD_RDX=0XD0;
                        CMD_RDY=0X90;         
                }                 
                return 1;         
        }
        return 0;
}
不过虽然可以保存校准值了,但是后面的画图测试无法用了,点屏幕没反应。不知道问题出在哪里?
按照你说的试了下,好像不行。