UART通讯
本帖最后由 work67 于 2013-11-8 16:08 编辑这是我找的一个UART的通讯例程,DSP实现将接收到的数据转发回去,不过我对这UART通讯的本质还是弄不清楚,先改成自由发送跟接收的程序,但感觉拎不出来单纯发数据的那部分代码,哪位帮忙给解释一下,感激不尽啊void main(void)
{
/* Initialize CSL library - This is REQUIRED !!! */
/*初始化CSL库*/
CSL_init();
/*设置系统的运行速度为144MHz*/
PLL_config(&myConfig);
/*初始化McBSP1*/
hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
/*设置McBSP1*/
MCBSP_config(hMcbsp,&Mcbsp1Config);
MCBSP_getConfig(hMcbsp,&Mcbsptest);
settimer();
/*************************以下程序实现软件Uart************************/
/* 参考:HX-5509A 开发板使用手册 */
while(TRUE)
{
if(uart_recflag==1)
{
uart_recflag = 0;
if(uart_sendflag==0)
{
uart_bitsendcnt = 0;
uart_sendend = 0;
uart_sendcnten = 0;
uart_bitsend = 0;
uart_send = 0x41;
uart_sendflag = 1;
uart_sendbitcnt = 0;
}
}
};
}
interrupt void timer0Isr(void)
{
temp = REG_PCR1;
//Send
if(uart_sendflag==1)
{
if(uart_sendcnten==0)
{
REG_PCR1 &= 0xffdf;
uart_bitsend = 1;
uart_sendcnten = 1;
}
if(uart_sendcnten==1)
{
uart_bitsendcnt++;
if(uart_bitsendcnt==10)
{
uart_sendbitcnt++;
if(uart_sendend==1)
{
uart_sendflag = 0;
}
else
{
if(uart_sendbitcnt<9)
{
if((uart_send & uart_bitsend)==0)
{
REG_PCR1 &= 0xffdf;
}
else
{
REG_PCR1 |= 0x0020;
}
uart_bitsend <<= 1;
}
else
{
REG_PCR1 |= 0x0020;
uart_sendflag = 0;
}
}
uart_bitsendcnt = 0;
}
}
}
//Receive
if((uart_bitcnt==0)&&(uart_recstart==0))
{
if((temp&0x0010)==0)
{
timer0_cnt = 0;
timer0_cnten = 1;
uart_bitscan = 0;
uart_rec = 0;
uart_recstart = 1;
}
}
if(timer0_cnten==1)
{
timer0_cnt++;
if((temp&0x0010)!=0)
{
uart_bitscan++;
}
if(timer0_cnt==10)
{
timer0_cnt = 0;
if(uart_bitscan>5)
{
switch(uart_bitcnt)
{
case 0:uart_rec = 0;
timer0_cnten = 0;
uart_recstart = 0;
break;
case 1:uart_bitcnt++;
uart_rec |= 0x01;
break;
case 2:uart_bitcnt++;
uart_rec |= 0x02;
break;
case 3:uart_bitcnt++;
uart_rec |= 0x04;
break;
case 4:uart_bitcnt++;
uart_rec |= 0x08;
break;
case 5:uart_bitcnt++;
uart_rec |= 0x10;
break;
case 6:uart_bitcnt++;
uart_rec |= 0x20;
break;
case 7:uart_bitcnt++;
uart_rec |= 0x40;
break;
case 8:uart_bitcnt++;
uart_rec |= 0x80;
break;
case 9:uart_bitcnt = 0;
timer0_cnten = 0;
uart_recflag = 1;
uart_recstart = 0;
break;
default: break;
}
}
else
{
uart_bitcnt++;
if(uart_bitcnt>9)
{
uart_bitcnt = 0;
timer0_cnten = 0;
}
}
uart_bitscan = 0;
}
}
}
将McBSP配置为串口 你的代码有些乱
没看出头绪 先看看这本书
https://bbs.21ic.com/icview-633042-1-1.html
zhangmangui 发表于 2013-11-8 16:45 static/image/common/back.gif
将McBSP配置为串口 你的代码有些乱
没看出头绪 先看看这本书
https://bbs.21ic.com/icview-633042- ...
谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接收到的数据,但是用不起来 work67 发表于 2013-11-8 17:00 static/image/common/back.gif
谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接 ...
慢慢来加油 zhangmangui 发表于 2013-11-8 22:49 static/image/common/back.gif
慢慢来加油
work67 发表于 2013-11-11 14:26 static/image/common/back.gif
我也在学习5509多多交流 zhangmangui 发表于 2013-11-11 23:54 static/image/common/back.gif
我也在学习5509多多交流
对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值,其中
ioport unsigned int *PCR_1=(unsigned int *)0x2c12;
#define REG_PCR1 (*PCR_1)
我弄不明白的是temp中的值应该是引脚上的值,比如输入0xAA,那temp中的值即为0xAA?
就是PC机上的数据如何传送到DSP中尽心该处理的过程不明白。。。 yangmm11 发表于 2014-10-14 16:12 static/image/common/back.gif
对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值 ...
他这种配置应该只能一次发送一位
要先熟悉UART的原理 相当预计GPIO模拟采集的吧
你看看 有专门讲解的视频 我有分享 zhangmangui 发表于 2014-10-14 23:52 static/image/common/back.gif
他这种配置应该只能一次发送一位
要先熟悉UART的原理 相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...
你说的视频时5509A中的UART通信实验的视频吗?我就是参考UART通信试验中的McBSP配置和软件模拟异步通信这连个视频,理解的这个程序,但是对于程序中的temp里面的值到底怎么改变的,没弄明白。。 zhangmangui 发表于 2014-10-14 23:52 static/image/common/back.gif
他这种配置应该只能一次发送一位
要先熟悉UART的原理 相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...
gpio模式没找到 yangmm11 发表于 2014-10-15 08:59 static/image/common/back.gif
你说的视频时5509A中的UART通信实验的视频吗?我就是参考UART通信试验中的McBSP配置和软件模拟异步通信这 ...
不明白的是temp中的数据时如何改变的? temp = REG_PCR1;从这句话看出,应该是REG_PCR1中的值,结合
ioport unsigned int *PCR_1=(unsigned int *)0x2c12;
#define REG_PCR1 (*PCR_1)它是不是指的是PCR_1中的值?若是的话,和输入DR引脚中寄存器中的值有何关系?即输入的值如何与*PCR_1连接起来? yangmm11 发表于 2014-10-15 10:08 static/image/common/back.gif
gpio模式没找到
您好这个链接中有很多资料请查看
有相关视频
https://bbs.21ic.com/icview-689506-1-1.html
zhangmangui 发表于 2014-10-15 22:12 static/image/common/back.gif
您好这个链接中有很多资料请查看
有相关视频
https://bbs.21ic.com/icview-689506-1-1.html
我看完视频之后,结合DR引脚中数据的传输方式,现在对程序是这样理解的:
DSP接收引脚DR中的数据存在了寄存器DRR中,通过访问IOPORT能够访问到DRR寄存器中的值,PCR_1寄存器中的标志位DRSTAT与DXSTAT可判断DR引脚中是否有数据传输,即判断temp中的第四位是否为零。数据未开始传输时,temp第4位为零,开始传输时,为1,其它位值不改变,这样理解是否正确呢?
还有就是,DR引脚中的数据一位一位的开始传输,那传输的值是赋给uart_rec 了?但是看下面switch时,uart_rec初始值为“00000000”,”或“操作完成之后,难道不是变成了全”11111111“,那DR引脚中的每位数据的值从哪体现出来?
switch(uart_bitcnt)
{
case 0:uart_rec = 0;
timer0_cnten = 0;
uart_recstart = 0;
break;
case 1:uart_bitcnt++;
uart_rec |= 0x01;
break;
case 2:uart_bitcnt++;
uart_rec |= 0x02;
break;
case 3:uart_bitcnt++;
uart_rec |= 0x04;
break;
case 4:uart_bitcnt++;
uart_rec |= 0x08;
break;
case 5:uart_bitcnt++;
uart_rec |= 0x10;
break;
case 6:uart_bitcnt++;
uart_rec |= 0x20;
break;
case 7:uart_bitcnt++;
uart_rec |= 0x40;
break;
case 8:uart_bitcnt++;
uart_rec |= 0x80;
break;
case 9:uart_bitcnt = 0;
timer0_cnten = 0;
uart_recflag = 1;
uart_recstart = 0;
break;
default: break;
}
比如上面的例子中,case的结果分别是uart_rec的每一位“或”之后的结果,那uart_rec的值从程序中可以看出,一开始为0,后来怎么改变的呢?
yangmm11 发表于 2014-10-16 15:26 static/image/common/back.gif
比如上面的例子中,case的结果分别是uart_rec的每一位“或”之后的结果,那uart_rec的值从程序中可以看 ...
为什么每次case之后的结果,就是所要传输的数据每一位的值,其中“或|”操作的步骤是如何改变uart_rec值的呢? 自己给自己顶一下,哪位好心人给解答一下阿,困扰我好久了 13年的帖子 19年顶
页:
[1]