请教: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: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;
乘风飞扬 发表于 2023-4-7 18:14
你的初始化方法有问题,像以下这些方法是不行的,还是老老实实把固定值写入寄存器。
例如:
前面定义:
谢谢提醒!本来是用的固定值,后来修改出错了。但读数据还未解决,继续查找中……
页:
[1]