niugangzhou 发表于 2022-6-7 17:41:58

同公司两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再读按键
}
}

niugangzhou 发表于 2022-6-7 17:42:39

额忘了说了,引脚全部是强推挽输出

1a2b3c 发表于 2022-6-7 17:52:42

强推完输出仍然可以作为输入读的?

hecat 发表于 2022-6-7 17:56:09

猜测是时序问题,试试在访问TM1623的每一个IO操作间加入延迟。

wxws 发表于 2022-6-7 18:52:24

这种问题,用个几十的逻辑分析仪吧

kinoko 发表于 2022-6-7 20:56:18

赛元某些型号在IO设定为输出时,读到的不是IO的电平,而是寄存器值。这些坑爹型号想读电平要另外配置一个寄存器把读电平的功能打开。

niugangzhou 发表于 2022-6-7 21:46:48

1a2b3c 发表于 2022-6-7 17:52
强推完输出仍然可以作为输入读的?
(引用自3楼)

额,虽然我也不明白为啥,但是确实能读出来

niugangzhou 发表于 2022-6-7 21:51:54

wxws 发表于 2022-6-7 18:52
这种问题,用个几十的逻辑分析仪吧
(引用自5楼)

有逻辑分析仪和示波器,我不太会用。虽然没完全抓出来波形,但是确认了从1623返回的数据应该没出问题。所以才猜测和单片机有关,换了个单片机,果然就正常了。但是实在想不明白单片机出了什么问题,

dellric 发表于 2022-6-7 22:24:22

读取引脚数据前建议你配置成开漏上拉且下面MOSFET关断,强推挽真不适合读取引脚数据,也有可能一个单片机的输出能力强一个弱一些。

lb0857 发表于 2022-6-7 22:36:45

晶振配置
IO口配置

io驱动能力

liyang121316 发表于 2022-6-7 23:27:19

本帖最后由 liyang121316 于 2022-6-7 23:36 编辑

明显两者时钟不一样。一个最高24M,另一个最高16M。找到系统时钟相关函数或寄存器把7352的fsys设置成和7422的fsys一致就行了。(图片上传不方便,看手册7.4节时钟部分)

szxszx 发表于 2022-6-8 07:35:38

看一下这个文件

1a2b3c 发表于 2022-6-8 08:03:34

niugangzhou 发表于 2022-6-7 21:46
额,虽然我也不明白为啥,但是确实能读出来
(引用自7楼)

你读出来没问题,你发读取命令是输出,新片那边当然可以收到并输出数据。关键是你接收不了。
另外你怎么知道那边输出了以及是对的?示波器看的?既然都看到了是对的,那肯定是单片机这边接收io问题了

niugangzhou 发表于 2022-6-8 09:08:49

dellric 发表于 2022-6-7 22:24
读取引脚数据前建议你配置成开漏上拉且下面MOSFET关断,强推挽真不适合读取引脚数据,也有可能一个单片机的 ...
(引用自9楼)

谢谢大哥,确实是我自己太蠢了。换成上拉输入返回数据就正常了。这么低级的问题还麻烦各位大哥帮忙解答,实在太抱歉了

dellric 发表于 2022-6-8 09:52:44

niugangzhou 发表于 2022-6-8 09:08
谢谢大哥,确实是我自己太蠢了。换成上拉输入返回数据就正常了。这么低级的问题还麻烦各位大哥帮忙解答, ...
(引用自14楼)

不用责备自己,搞技术这行,趴的坑多了,自然就厉害了,真要感谢的是公司给你的试错机会,那是有成本的。

jiki911 发表于 2022-6-8 14:27:34

10.89就是时序引起的。代码一样,可是晶振不一样,跑得节拍就不一样,数码管及按键驱动的节拍时序就存在很大差异,增加节拍延时。调节一下就好。有条件,就加示波器,好好看看 时序
页: [1]
查看完整版本: 同公司两MCU跑同程序。只一个芯片能跑,求教两MCU区别在哪