同公司两MCU跑同程序。只一个芯片能跑,求教两MCU区别在哪
深圳赛元的单片机,一个是SC92F7352,一个是SC92F7422。两个单片机的引脚基本一致,可做之间替换。我从网上扒了一个TM1623的例程,直接套上去用。一共驱动7个数码管。9个按键。一开始用7352,LED正常,但是按键一直不好使,串口打印出来,返回的数值都是0xFF。完全不带变化的。找了好久问题,没找到。后来换了个单片机(7422),发现一切正常了。看了好久规格书,还是不太明白有什么可以导致这样的区别。希望有大佬看看,我的见识不够,看不出来。
#define uchar unsigned char //数据类型宏定义
#define uint unsigned int //数据类型宏定义
#define nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//宏定义
/********************定义数据*************************/
ucharCODE={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管0~9字型码
ucharTAB={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//共阴数码管无显示字型码
ucharCCC1={0x3F};
ucharCCC2={0x00,0x06};
ucharCCC3={0x00,0x00,0x5B};
ucharCCC4={0x00,0x00,0x00,0x4F};
uchar KEY={0}; //为存储按键值定义的数组
/***************延时函数nms**************/
void delay_nms(uint n)
{
uint i;
while(n--)
{
for(i=0;i<550;i++);
}
}
/***************发送8bit数据,从低位开始**************/
void send_8bit(uchar dat) //发送8位数据,从低位开始
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
if(dat&0x01)
DIO=1;
else
DIO=0;
_nop_();
_nop_();
_nop_();
CLK=1;
dat>>=1;
}
CLK=0;
DIO=0;
}
/******************发送控制命令***********************/
void send_command(uchar com)//发送命令字节
{
STB=1; //STB置高
nop;
STB=0; //STB置低
send_8bit(com); //发送8bit数据
}
/****************读取按键值并存储*******************/
void read_key(void) //读取5字节按键值并存入数组KEY[],从低字节、低位开始
{
unsigned char i,j;
send_command(0x42); //发送读按键命令
DIO=1; //释放DIO数据总线
for(j=0;j<5;j++) //连续读取5个字节
{
for(i=0;i<8;i++)
{
CLK=0;
KEY=KEY>>1;
CLK=1;
if(DIO==1)
{
KEY=KEY|0x80;
}
nop;
}
nop;
nop;
}
CLK=0;
DIO=0;
STB=1;
}
/************显示函数,数码管1~7位显示0~6************/
void display(uchar *p) //显示函数,1~7位数码管显示0~6
{
uchar i;
send_command(0x03); //设置显示模式,7位10段模式
send_command(0x40); //设置数据命令,采用地址自动加1模式
send_command(0xc0); //设置显示地址,从00H开始
for(i=0;i<7;i++)
{
send_8bit(*p); //从00H开始,偶数地址送显示数据
send_8bit(0x00); //因为SEG9-14未用到,所以奇数地址送全0
p++;
}
send_command(0x8F); //设置显示命令,打开显示并设置占空比14/16.
STB=1;
}
/*****************按键处理函数*********************/
void key_process() // 按键处理函数
{
if(KEY!=0x00)
{
if((KEY==0x01)) {display(CODE);} //A
if((KEY==0x02)) {display(TAB);}//B-void
if((KEY==0x04)) {display(CCC1);}//C-0
if((KEY==0x08)) {display(CCC2);}//32-1
if((KEY==0x10)) {display(CCC3);}//31-2
if((KEY==0x20)) {display(CCC4);}//22-3
}
}
void main()
{
IO_Init();
display(CODE); //上电显示0~6
delay_nms(1);
while(1)
{
read_key(); //读按键值
key_process(); //按键处理
delay_nms(200); //延时200ms再读按键
}
}
额忘了说了,引脚全部是强推挽输出 强推完输出仍然可以作为输入读的? 猜测是时序问题,试试在访问TM1623的每一个IO操作间加入延迟。 这种问题,用个几十的逻辑分析仪吧 赛元某些型号在IO设定为输出时,读到的不是IO的电平,而是寄存器值。这些坑爹型号想读电平要另外配置一个寄存器把读电平的功能打开。 1a2b3c 发表于 2022-6-7 17:52
强推完输出仍然可以作为输入读的?
(引用自3楼)
额,虽然我也不明白为啥,但是确实能读出来 wxws 发表于 2022-6-7 18:52
这种问题,用个几十的逻辑分析仪吧
(引用自5楼)
有逻辑分析仪和示波器,我不太会用。虽然没完全抓出来波形,但是确认了从1623返回的数据应该没出问题。所以才猜测和单片机有关,换了个单片机,果然就正常了。但是实在想不明白单片机出了什么问题, 读取引脚数据前建议你配置成开漏上拉且下面MOSFET关断,强推挽真不适合读取引脚数据,也有可能一个单片机的输出能力强一个弱一些。 晶振配置
IO口配置
io驱动能力 本帖最后由 liyang121316 于 2022-6-7 23:36 编辑
明显两者时钟不一样。一个最高24M,另一个最高16M。找到系统时钟相关函数或寄存器把7352的fsys设置成和7422的fsys一致就行了。(图片上传不方便,看手册7.4节时钟部分)
看一下这个文件 niugangzhou 发表于 2022-6-7 21:46
额,虽然我也不明白为啥,但是确实能读出来
(引用自7楼)
你读出来没问题,你发读取命令是输出,新片那边当然可以收到并输出数据。关键是你接收不了。
另外你怎么知道那边输出了以及是对的?示波器看的?既然都看到了是对的,那肯定是单片机这边接收io问题了 dellric 发表于 2022-6-7 22:24
读取引脚数据前建议你配置成开漏上拉且下面MOSFET关断,强推挽真不适合读取引脚数据,也有可能一个单片机的 ...
(引用自9楼)
谢谢大哥,确实是我自己太蠢了。换成上拉输入返回数据就正常了。这么低级的问题还麻烦各位大哥帮忙解答,实在太抱歉了 niugangzhou 发表于 2022-6-8 09:08
谢谢大哥,确实是我自己太蠢了。换成上拉输入返回数据就正常了。这么低级的问题还麻烦各位大哥帮忙解答, ...
(引用自14楼)
不用责备自己,搞技术这行,趴的坑多了,自然就厉害了,真要感谢的是公司给你的试错机会,那是有成本的。 10.89就是时序引起的。代码一样,可是晶振不一样,跑得节拍就不一样,数码管及按键驱动的节拍时序就存在很大差异,增加节拍延时。调节一下就好。有条件,就加示波器,好好看看 时序
页:
[1]