qlw_cq 发表于 2023-4-7 14:08:43

请教:STC32G12K128 操作 EMP240T100C5N 问题?

STC32G12K128 操作 EMP240T100C5N 问题?


//==硬件定义==
sbit         AD_BUSY =P3^3;                                          //INT1中断输入 AD转换忙信号 0=转换结束 1=转换中
sbit    E240_CS =P7^5;                                          //CS片选
sbit    E240_RS =P4^5;                                          //RS数据/指令
sbit    E240_RD =P4^4;                                          //RD读
sbit    E240_WR =P4^2;                                       //WR写

//#define E240_BUS_H   P2                                       //数据端口P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
#define E240_BUS    P0                                          //数据端口P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8       由于画板时疏忽,未能选STC推荐的P2、P6口

//--CSRSWRRD定义CPLD操作地址 --------------------------
//   0    0    0    1   CPLD写命令: CS=0RS=0WR=0RD=1            
//   0    1    0    1   CPLD写数据: CS=0RS=1WR=0RD=1
//   0    0    1    0   CPLD读状态: CS=0RS=0WR=1RD=0
//   0    1    1    0   CPLD读数据: CS=0RS=1WR=1RD=0



/*==============|===============|===============|===============
* 功    能:CPLD GPIO设置
//GPIO_PullUp   PxM1 &= ~Px.n,        PnM0 &= ~Px.n;       //上拉准双向口
//GPIO_OUT_PP   PxM1 &= ~Px.n,        PnM0 |=Px.n;       //推挽输出
//GPIO_HighZ      PxM1 |=Px.n,        PnM0 &= ~Px.n;       //浮空输入
//GPIO_OUT_OD   PxM1 |=Px.n,        PnM0 |=Px.n;       //开漏输出
================|===============|===============|=============*/
void Emp240Init(void)                                           //初始化EPM240
{
//    P0M1 &=~E240_BUS,        P0M0 |= E240_BUS;                            //推挽输出
    P0PU |= 0xff;                                             //P0口开启内部上拉4.1K
//    P0IE |= 0xff;                                             //P0数字信号许可
//    P0SR |= 0xff;                                             //输出速度 1=慢
   
    P3M1 |= AD_BUSY,        P3M0 &=~AD_BUSY;                            //浮空输入AD_BUSY
    P3PU |= AD_BUSY;                                          //P3^3(AD_BUSY)   开启内部上拉4.1K
   
//    P4M1 &=~(E240_RS|E240_WR|E240_RD),P4M0 |=(E240_RS|E240_WR|E240_RD);   //推挽输出
//    P7M1 &=~E240_CS,                  P7M0 |= E240_CS;      //推挽输出
    P4PU |=(E240_RS|E240_WR|E240_RD);                           //P4口开启内部上拉4.1K   
    P7PU |= E240_CS;                                          //P7口开启内部上拉4.1K                  

    E240_CS= 1;                                             //CS 0片选
    E240_RS= 1;                                             //RS 0指令、状态/1数据
    E240_WR= 1;                                             //WR 0写
    E240_RD= 1;                                             //RD 0读
    E240_BUS =0xff;                                             //拉高
}



void E240_delay(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/*==============|===============|===============|===============
* 功    能:        写CPLD寄存器                regval:寄存器值   CPLD写命令: CS=0RS=0WR=0RD=1       
================|===============|===============|=============*/
void CpldWriteReg(u8 cmd)                                       //写CPLD寄存器(u8 cmd)
{   
    E240_CS= 0;                                             //CS 0片选
    E240_RS= 0;       _nop_();    _nop_();                  //RS 1数据/0指令、状态

        E240_BUS = cmd;   _nop_();    _nop_();                  //CPLD写命令
    E240_delay();
    E240_WR= 0;       _nop_();    _nop_();                  //WR写
    E240_WR= 1;                                             //WR写

    E240_RS= 1;                                             //RS数据/指令
    E240_CS= 1;                                             //CS片选   
}

/*==============|===============|===============|===============
* 功    能:        写CPLD数据(u8 dat)   CPLD写数据: CS=0RS=1WR=0RD=1                                                                                                                       
================|===============|===============|=============*/
void CpldWriteData(u8 dat)                                    //写CPLD数据(u8 dat)
{          
    E240_CS= 0;       _nop_();    _nop_();                  //CS片选

    E240_BUS = dat;   _nop_();    _nop_();                  //CPLD写命令
    E240_delay();   
    E240_WR= 0;       _nop_();    _nop_();                  //WR写
    E240_WR= 1;                                             //WR写

    E240_CS= 1;                                             //CS片选   
}

/*==============|===============|===============|===============
* 功    能:        读CPLD寄存器状态      CPLD读状态: CS=0RS=0WR=1RD=0
* 返 回 值: 读到的状态u8
================|===============|===============|=============*/
u8 CpldReadSta(void)                                          //读CPLD寄存器状态,返回(u8 sta)
{                                                                                  
    u8 sta;                                                                    //
   
    E240_BUS =0xff;                                             //拉高
//   P0M1 |= E240_BUS,        P0M0 &=~E240_BUS;                            //浮空输入
   
    E240_CS= 0;                                             //CS 0片选
    E240_RS= 0;       _nop_();    _nop_();                  //RS 1数据/0指令、状态

    E240_RD= 0;       _nop_();    _nop_();                  //RD读   
    E240_delay();
    sta = E240_BUS;                                             //CPLD读命令
    E240_delay();   
    E240_RD= 1;                                             //RD读

    E240_RS= 1;                                             //RS数据/指令
    E240_CS= 1;                                             //CS片选
   
//    P0M1 &=~E240_BUS,        P0M0 |= E240_BUS;                            //推挽输出
//    E240_BUS =0xff;                                             //拉高
   
        return sta;       
}

/*==============|===============|===============|===============
* 功    能:        读CPLD数据             CPLD读数据: CS=0RS=1WR=1RD=0                                                                                                                
================|===============|===============|=============*/
u8CpldReadData(void)                                          //读CPLD数据,返回(u8 dat)
{
    u8 dat;                                                                    //

    E240_BUS =0xff;                                             //拉高
//    P0M1 |= E240_BUS,        P0M0 &=~E240_BUS;                            //浮空输入
   
    E240_CS= 0;       _nop_();    _nop_();                  //CS 0片选

    E240_RD= 0;       _nop_();    _nop_();                  //RD读
    E240_delay();
    dat = E240_BUS;                                          //CPLD读命令
    E240_delay();   
    E240_RD= 1;                                             //RD读

    E240_CS= 1;                                             //CS片选
   
//   P0M1 &=~E240_BUS,        P0M0 |= E240_BUS;                            //推挽输出
//   E240_BUS =0xff;                                             //拉高
   
        return dat;          
}

/*==============|===============|===============|===============
* 功    能:        写CPLD寄存器-数据
*   LCD_Reg:寄存器地址   LCD_RegValue:要写入的数据                                                                                                                       
================|===============|===============|=============*/
void CpldWriteRegVal(u8 cmd, u8 dat)                            //写CPLD寄存器-数据(u8 cmd, u8 dat)
{       
    CpldWriteReg( cmd);                                       //写CPLD寄存器(u8 cmd)
    CpldWriteData( dat);                                        //写CPLD数据(u8 dat)   
}


    数据写入CPLD芯片EMP240T00C5N没问题,能输出产生正弦波……,但读取CPLD数据时无数据输出?请教P0口数据读写正确的操作,谢谢!


乘风飞扬 发表于 2023-4-7 18:14:01

本帖最后由 乘风飞扬 于 2023-4-7 18:17 编辑

你的初始化方法有问题,像以下这些方法是不行的,还是老老实实把固定值写入寄存器。
//    P0M1 &=~E240_BUS,      P0M0 |= E240_BUS;                            //推挽输出

    P3M1 |= AD_BUSY,      P3M0 &=~AD_BUSY;                            //浮空输入AD_BUSY
    P3PU |= AD_BUSY;                                          //P3^3(AD_BUSY)   开启内部上拉4.1K
   
//    P4M1 &=~(E240_RS|E240_WR|E240_RD),P4M0 |=(E240_RS|E240_WR|E240_RD);   //推挽输出
//    P7M1 &=~E240_CS,                  P7M0 |= E240_CS;      //推挽输出
    P4PU |=(E240_RS|E240_WR|E240_RD);                           //P4口开启内部上拉4.1K   
    P7PU |= E240_CS;                                          //P7口开启内部上拉4.1K   例如:
P4PU |=(E240_RS|E240_WR|E240_RD); //P4口开启内部上拉4.1K前面定义:
sbit    E240_CS =P7^5;                                          //CS片选
sbit    E240_RS =P4^5;                                          //RS数据/指令
sbit    E240_RD =P4^4;                                          //RD读
sbit    E240_WR =P4^2;                                       //WR写应该是期望 P4PU = 0x34; 这样才能将P4.5,P4.4,P4.2的内部上拉打开。
然而 E240_RS,E240_RD,E240_WR,它们代表的是一个个脚位,取值是0或者1,而非 0x20,0x10,0x04。
此外内部上拉寄存器是扩展寄存器,设置前应先开启扩展寄存器访问使能:P_SW2 |= 0x80; 或者 EAXFR = 1;

qlw_cq 发表于 2023-4-8 15:30:01

乘风飞扬 发表于 2023-4-7 18:14
你的初始化方法有问题,像以下这些方法是不行的,还是老老实实把固定值写入寄存器。
例如:
前面定义:


谢谢提醒!本来是用的固定值,后来修改出错了。但读数据还未解决,继续查找中……
页: [1]
查看完整版本: 请教:STC32G12K128 操作 EMP240T100C5N 问题?