搜索
bottom↓
回复: 15

同公司两MCU跑同程序。只一个芯片能跑,求教两MCU区别在哪

[复制链接]

出0入0汤圆

发表于 2022-6-7 17:41:58 | 显示全部楼层 |阅读模式
深圳赛元的单片机,一个是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_();//宏定义



/********************定义数据*************************/
uchar  CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //共阴数码管0~9字型码
uchar  TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //共阴数码管无显示字型码
uchar  CCC1[10]={0x3F};
uchar  CCC2[10]={0x00,0x06};
uchar  CCC3[10]={0x00,0x00,0x5B};
uchar  CCC4[10]={0x00,0x00,0x00,0x4F};


uchar KEY[5]={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[j]=KEY[j]>>1;
  CLK=1;
  if(DIO==1)
  {
    KEY[j]=KEY[j]|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[0]!=0x00)
   {
    if((KEY[0]==0x01)) {display(CODE);} //A
    if((KEY[0]==0x02)) {display(TAB);}//B-void  
                if((KEY[0]==0x04)) {display(CCC1);}//C-0
                if((KEY[0]==0x08)) {display(CCC2);}//32-1
                if((KEY[0]==0x10)) {display(CCC3);}//31-2
                if((KEY[0]==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再读按键
}
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2022-6-7 17:42:39 | 显示全部楼层
额忘了说了,引脚全部是强推挽输出

出0入475汤圆

发表于 2022-6-7 17:52:42 来自手机 | 显示全部楼层
强推完输出仍然可以作为输入读的?

出0入25汤圆

发表于 2022-6-7 17:56:09 | 显示全部楼层
猜测是时序问题,试试在访问TM1623的每一个IO操作间加入延迟。

出0入228汤圆

发表于 2022-6-7 18:52:24 来自手机 | 显示全部楼层
这种问题,用个几十的逻辑分析仪吧

出110入26汤圆

发表于 2022-6-7 20:56:18 | 显示全部楼层
赛元某些型号在IO设定为输出时,读到的不是IO的电平,而是寄存器值。这些坑爹型号想读电平要另外配置一个寄存器把读电平的功能打开。

出0入0汤圆

 楼主| 发表于 2022-6-7 21:46:48 | 显示全部楼层
1a2b3c 发表于 2022-6-7 17:52
强推完输出仍然可以作为输入读的?
(引用自3楼)

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

出0入0汤圆

 楼主| 发表于 2022-6-7 21:51:54 | 显示全部楼层
wxws 发表于 2022-6-7 18:52
这种问题,用个几十的逻辑分析仪吧
(引用自5楼)

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

出0入71汤圆

发表于 2022-6-7 22:24:22 | 显示全部楼层
读取引脚数据前建议你配置成开漏上拉且下面MOSFET关断,强推挽真不适合读取引脚数据,也有可能一个单片机的输出能力强一个弱一些。

出1310入193汤圆

发表于 2022-6-7 22:36:45 | 显示全部楼层
晶振配置
IO口配置

io驱动能力

出0入42汤圆

发表于 2022-6-7 23:27:19 | 显示全部楼层
本帖最后由 liyang121316 于 2022-6-7 23:36 编辑

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

出10入10汤圆

发表于 2022-6-8 07:35:38 | 显示全部楼层
看一下这个文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入475汤圆

发表于 2022-6-8 08:03:34 来自手机 | 显示全部楼层
niugangzhou 发表于 2022-6-7 21:46
额,虽然我也不明白为啥,但是确实能读出来
(引用自7楼)

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

出0入0汤圆

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

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

出0入71汤圆

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

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

出0入0汤圆

发表于 2022-6-8 14:27:34 | 显示全部楼层
10.89就是时序引起的。代码一样,可是晶振不一样,跑得节拍就不一样,数码管及按键驱动的节拍时序就存在很大差异,增加节拍延时。调节一下就好。有条件,就加示波器,好好看看 时序
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 16:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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