找回密码
 立即注册
查看: 752|回复: 2

请教:STC32G12K128 操作 EMP240T100C5N 问题?

[复制链接]

1

主题

1

回帖

17

积分

新手上路

积分
17
发表于 2023-4-7 14:08:43 | 显示全部楼层 |阅读模式
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                                       //数据[15..8]端口P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
#define E240_BUS    P0                                          //数据[7..0]端口P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8       由于画板时疏忽,未能选STC推荐的P2、P6口

//--CS  RS  WR  RD  定义CPLD操作地址 --------------------------
//   0    0    0    1   CPLD写命令: CS=0  RS=0  WR=0  RD=1              
//   0    1    0    1   CPLD写数据: CS=0  RS=1  WR=0  RD=1
//   0    0    1    0   CPLD读状态: CS=0  RS=0  WR=1  RD=0
//   0    1    1    0   CPLD读数据: CS=0  RS=1  WR=1  RD=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=0  RS=0  WR=0  RD=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=0  RS=1  WR=0  RD=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=0  RS=0  WR=1  RD=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=0  RS=1  WR=1  RD=0                                                                                                                
================|===============|===============|=============*/
u8  CpldReadData(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口数据读写正确的操作,谢谢!


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-4-7 18:14:01 | 显示全部楼层
本帖最后由 乘风飞扬 于 2023-4-7 18:17 编辑

你的初始化方法有问题,像以下这些方法是不行的,还是老老实实把固定值写入寄存器。
  1. //    P0M1 &=~E240_BUS,        P0M0 |= E240_BUS;                            //推挽输出  
  2.     P3M1 |= AD_BUSY,        P3M0 &=~AD_BUSY;                            //浮空输入  AD_BUSY
  3.     P3PU |= AD_BUSY;                                            //P3^3(AD_BUSY)   开启内部上拉4.1K
  4.    
  5. //    P4M1 &=~(E240_RS|E240_WR|E240_RD),  P4M0 |=(E240_RS|E240_WR|E240_RD);   //推挽输出
  6. //    P7M1 &=~E240_CS,                    P7M0 |= E240_CS;        //推挽输出
  7.     P4PU |=(E240_RS|E240_WR|E240_RD);                           //P4口开启内部上拉4.1K     
  8.     P7PU |= E240_CS;                                            //P7口开启内部上拉4.1K   
复制代码
例如:
  1. P4PU |=(E240_RS|E240_WR|E240_RD); //P4口开启内部上拉4.1K
复制代码
前面定义:
  1. sbit    E240_CS =P7^5;                                          //CS片选
  2. sbit    E240_RS =P4^5;                                          //RS数据/指令
  3. sbit    E240_RD =P4^4;                                          //RD读
  4. 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;

回复 支持 反对

使用道具 举报 送花

1

主题

1

回帖

17

积分

新手上路

积分
17
发表于 2023-4-8 15:30:01 | 显示全部楼层
乘风*** 发表于 2023-4-7 18:14
你的初始化方法有问题,像以下这些方法是不行的,还是老老实实把固定值写入寄存器。
例如:
前面定义:

谢谢提醒!本来是用的固定值,后来修改出错了。但读数据还未解决,继续查找中……
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 15:41 , Processed in 0.168799 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表