打印

STM32用来做曼彻斯特码的问题

[复制链接]
10873|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kevinleez|  楼主 | 2010-12-1 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在要实现一个功能,就是比如我一个buf中有4000个数据,每个数据8bit,然后我要用2Mhz的速度在一个IO上实现连续发送这32000bit的数据,也就是0.5us一个bit,一个周期要16ms。应该是用STM32F103的TIMx和DMA吧。但是具体如何使用,有相关的例程吗?请教各位了。
沙发
mohanwei| | 2010-12-1 15:04 | 只看该作者
这种情况,选择合适的时钟频率,然后把中断关了,直接循环发送,延时就靠指令来算好了。

使用特权

评论回复
板凳
香水城| | 2010-12-1 15:17 | 只看该作者
麻烦LZ提醒一下曼彻斯特码是什么样的?为什么一个周期是16MS,而不是26或36MS?

使用特权

评论回复
地板
kevinleez|  楼主 | 2010-12-1 15:51 | 只看该作者
一个bit是0.5us,一个周期发送32000个bit,总共16ms。
但是要求每个bit都是连续的。

使用特权

评论回复
5
kevinleez|  楼主 | 2010-12-1 15:53 | 只看该作者
我的程序还有sd卡和usb和网络功能,所以用中断是一定不行的。
马老师有一篇帖子也说了,这种用中断做是不行的。
有定时器的特殊功能做,但是有时要求那么多不同byte连成的bit连续发送,所以是不是要涉及到DMA方式。
具体问题还要请教各位了。

使用特权

评论回复
6
香水城| | 2010-12-1 16:04 | 只看该作者
那么曼码到底是什么样的呢?

使用特权

评论回复
7
kevinleez|  楼主 | 2010-12-1 16:18 | 只看该作者
就是一串0和1的组合,设备要求单线传输。
0和1的组合,频率在2Mhz,也就是0.5us一个bit位。
我只是想知道这款cpu如何完成对一个io的高速的0和1的切换。

使用特权

评论回复
8
kevinleez|  楼主 | 2010-12-1 16:19 | 只看该作者
或者是要用DMA+SPI的方式吗?

使用特权

评论回复
9
kevinleez|  楼主 | 2010-12-1 16:32 | 只看该作者
送给 SDI 脚的输入信号必须遵循下列定义:
a. 有效输入数据必须为曼彻斯特编码,信号从高到低跳变表示"1",从低到高
跳变表示"0"
b. 在芯片上电后必须先发一次同步帧,以便芯片检测通讯的波特率。同步帧的
格式为:15’b111111111111111+4’b0001+11’b00000000000,在发送同步
帧后必须延时一段时间再发送数据帧,这样做是为了每个芯片都能准确检测
到通讯的波特率,延时时间(us)大于:连接芯片数÷通讯波率(MHz)×30
c. 在发送若干帧数据后,重新发送一次复位帧,等待1ms 之后,再发送一次同
步帧, 以便芯片消除积累误差, 复位帧格式为:
15’b111111111111111+4’b0100
d. 数据帧格式为:15’b111111111111111+4’b0010(数据头)+ 第一个芯片
39bit 数据 + 第二个芯片39bit 数据 + …… + 第n 个芯片39bit 数据
e. 第一个芯片为最先接收数据的芯片,芯片的数据格式为:1’ b0(标识位) + 12’
bxxxxxxxxxxxx(输出端口1 数据) + 1’ b0(标识位) + 12’ bxxxxxxxxxxxx(输
出端口2 数据) + 1’ b0(标识位) + 12’ bxxxxxxxxxxxx(输出端口3 数据),
x 为1 或则0
f. 数据先发送 MSB(最高位)
g. SDI 输入脚在空闲状态时,必须保持低电平
h. 同一帧数据发送过程中,必须连续发送,中间不能有中断,发送频率也不能
改变。

使用特权

评论回复
10
mxh0506| | 2010-12-1 20:42 | 只看该作者
软件实现曼彻斯特编/解码?

使用特权

评论回复
11
xwj| | 2010-12-1 21:02 | 只看该作者
你应该把数据先进行编码放入缓存,然后DMA只管顺序发送即可。

曼彻斯特编码也就2bit代表一位而已,采用双缓存乒乓处理即可

使用特权

评论回复
12
lxyppc| | 2010-12-1 22:51 | 只看该作者
楼主你的这个要求用单纯翻转IO可能有点够呛,可能要用点非常规的方法。
因为没有时钟信号,你的传输方式要求在传输过程中一定不能被打断,DMA貌似满足不了这个要求

你的USB通讯用的是什么方式,数据量有多大

使用特权

评论回复
13
kevinleez|  楼主 | 2010-12-1 23:13 | 只看该作者
to 12楼:
关键就是单线传输的话,传输过程一定不能被打断。
usb通讯这部分已经搞定,可以吧sd卡中的数据当u盘读出。
现在关键就是发送部分。
我现在有点动摇了,估计要外加cpld或者fpga了。

使用特权

评论回复
14
kevinleez|  楼主 | 2010-12-1 23:14 | 只看该作者
如果真的用fpga的话,是否就可以一颗fpga上nios搞定所有呢?按理是可以的。
EP3C应该就行吧。

使用特权

评论回复
15
香水城| | 2010-12-2 06:47 | 只看该作者
照10楼说的做,不需要使用FPGA。

使用特权

评论回复
16
z_no1| | 2010-12-2 08:48 | 只看该作者
放心吧,驱动TLS3001吧?我做过的,没问题。用SPI+DMA.

使用特权

评论回复
17
kevinleez|  楼主 | 2010-12-2 09:31 | 只看该作者
to 16楼:
对的,就是驱动TLS3001,你有qq不,可否交流一下?

使用特权

评论回复
18
wall.e| | 2010-12-2 10:15 | 只看该作者
学习了。。。。

使用特权

评论回复
19
lianshumou| | 2010-12-2 13:55 | 只看该作者
一个定时器,一个DMA 完事!

使用特权

评论回复
20
香水城| | 2010-12-2 16:19 | 只看该作者
对TIM+DMA可以完全搞定。

使用特权

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

本版积分规则

46

主题

137

帖子

2

粉丝