打印

CCS3.3下开发28335碰到的数据格式问题

[复制链接]
5855|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我现在使用的是TMS320x28335,CCS3.3版本进行仿真,watch window中8位变量显示为16位,例如:
Uint8 uc_BufTdSci[700];
Uint8 uc_BufRdSci[20];


还有在做数据拷贝的时候,也碰到同样的问题:
memcpy((Uint8 *)&uc_BufTdSci[11], (Uint8 *)&s_ACSRealData.ui_U[0], 2);
此时s_ACSRealData.ui_U[0]=0x55F0,按照标准C函数,结果应该是uc_BufTdSci[11]=0xF0,uc_BufTdSci[12]=0x55。但实际上,看到的结果是uc_BufTdSci[11]=0x55F0。

仿真截图见附图,希望TX们帮忙看看怎么检查。

未命名.jpg (268.95 KB )

未命名.jpg

相关帖子

沙发
mpuhome| | 2013-5-23 09:13 | 只看该作者
因为物理上,28335的存储单元都是16位的,你只要关心具体的结果对就可以了
据我的实际使用经验,8位的变量或者数组都是可以正常使用的

使用特权

评论回复
板凳
zhangmangui| | 2013-5-23 09:31 | 只看该作者
就2812中的定义来说  就没有Uint8的定义啊   不知道你的程序中的Uint8被重新定义成C语言中的那个类型了  

2812中的定义如下
typedef int                  int16;
typedef long                 int32;
typedef unsigned int          Uint16;
typedef unsigned long         Uint32;

使用特权

评论回复
地板
沈瑞强|  楼主 | 2013-5-23 09:55 | 只看该作者
感谢二位版主答复。
按照标准C定义:typedef unsigned char uint8;
但是结果是16位的;
不知要如何设置CCS或编译器;
再请TX们给出具体解决办法,谢了!

使用特权

评论回复
5
zhangmangui| | 2013-5-23 14:00 | 只看该作者
沈瑞强 发表于 2013-5-23 09:55
感谢二位版主答复。
按照标准C定义:typedef unsigned char uint8;
但是结果是16位的;

刚看了相关书籍  应该是可以的啊   8位

使用特权

评论回复
6
沈瑞强|  楼主 | 2013-5-23 14:08 | 只看该作者
zhangmangui 发表于 2013-5-23 14:00
刚看了相关书籍  应该是可以的啊   8位

能否帮忙试一下?或告知详细的解决办法?我试下来只能16位的,也google到28335内部确实字节定义是16bit的,妖怪的DSP设计啊,字节访问成问题了~

PS:现在是CCS3.3下试滴~

使用特权

评论回复
7
zhangmangui| | 2013-5-23 14:14 | 只看该作者
沈瑞强 发表于 2013-5-23 14:08
能否帮忙试一下?或告知详细的解决办法?我试下来只能16位的,也google到28335内部确实字节定义是16bit的 ...

我刚试啦   确实有这个问题的啊

使用特权

评论回复
8
zhangmangui| | 2013-5-23 14:15 | 只看该作者
沈瑞强 发表于 2013-5-23 14:08
能否帮忙试一下?或告知详细的解决办法?我试下来只能16位的,也google到28335内部确实字节定义是16bit的 ...



看看   我刚试了一下

使用特权

评论回复
9
zhangmangui| | 2013-5-23 14:21 | 只看该作者
interrupt void SCITXINTA_ISR(void)     // SCI-A
{
        unsigned char ReceivedAChar;
        DINT;//关闭总中断
       
        //自动侦测波特率处理
        if(SciaRegs.SCIFFCT.bit.ABD == 1)
           {
            SciaRegs.SCIFFCT.bit.ABDCLR = 1; //清除ABD
              SciaRegs.SCIFFCT.bit.CDC = 0; //禁止自动波特率侦测
              ReceivedAChar = SciaRegs.SCIRXBUF.all;
                SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
                SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将FIFO指针复位为0
                SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //退出复位状态
              if(ReceivedAChar == 'A')
                {        
                        Send_String_SCIA("right!");//        Autobaud
                        SciaRegs.SCIFFRX.bit.RXFFIENA = 1;// 使能SCIA FIFO接收中断
                        connect_right = 1;
                }       
              else
              {
                      Send_String_SCIA("wrong!");  //        Autobaud
                        connect_right = 0;
                }
           }
       
        SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
        PieCtrl.PIEACK.all |= M_INT9;   //响应中断
        EINT;   //开总中断
}

看看上面是我的程序  定义啦unsigned char ReceivedAChar;   判断if(ReceivedAChar == 'A')
工作都是正常的  这是我使用过的程序

使用特权

评论回复
10
liusensen| | 2013-5-23 14:38 | 只看该作者
静静的等待答案

使用特权

评论回复
11
沈瑞强|  楼主 | 2013-5-23 17:45 | 只看该作者
zhangmangui 发表于 2013-5-23 14:21
interrupt void SCITXINTA_ISR(void)     // SCI-A
{
        unsigned char ReceivedAChar;

SCI确实是可以的,因为28335的SCI是8位传输的,但是如果做一些计算,然后按照我的memcpy后再传输试试呢?
我现在的问题就是要将计算后的结果用SCI发出去,结果发现不对~

使用特权

评论回复
12
zhangmangui| | 2013-5-23 22:37 | 只看该作者
沈瑞强 发表于 2013-5-23 17:45
SCI确实是可以的,因为28335的SCI是8位传输的,但是如果做一些计算,然后按照我的memcpy后再传输试试呢? ...

28335不是很了解啊   还需你慢慢摸索呢   你这个问题我会帮你请教一些专业人士

使用特权

评论回复
13
沈瑞强|  楼主 | 2013-5-24 12:55 | 只看该作者
zhangmangui 发表于 2013-5-23 22:37
28335不是很了解啊   还需你慢慢摸索呢   你这个问题我会帮你请教一些专业人士 ...

好啊,最好有专业人士提供解决方案,谢谢了

使用特权

评论回复
14
zhangmangui| | 2013-5-26 12:20 | 只看该作者
沈瑞强 发表于 2013-5-24 12:55
好啊,最好有专业人士提供解决方案,谢谢了


使用特权

评论回复
15
jiemnij| | 2013-5-27 09:19 | 只看该作者
28335最小是16bit的 ..unsigned char/ char都是16bit所以无法如此复制
另外你说的的按照标准C函数,结果应该是uc_BufTdSci[11]=0xF0,uc_BufTdSci[12]=0x55
这个说法本身也是不对的...那还需要分大小端模式,  小端模式才是这种结果
要想解决这种问题..只有自己写一个拆分copy函数, , 左移动8位 和  与操作  总都会是吧

使用特权

评论回复
16
xiaowanziha| | 2013-5-28 09:47 | 只看该作者
是不是超范围了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

1

粉丝