OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4285|回复: 8

关于I2S的发送问题

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
发表于 2014-4-9 10:25:48 | 显示全部楼层 |阅读模式
现在想用I2S格式发送24位有效数据,也就是将24位打包进32位帧。由于SPI_DR是16位的,所以需要连续读取两次寄存器,但是SPI_I2S_SendData()这个函数貌似只能传输16位的数据到寄存器,请问我想发送24位的具体应该怎么做,用哪个函数?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-9 13:16:50 | 显示全部楼层
拆开24位来传即可,或者你仿照SPI_I2S_SendData()这个函数自己写一个发送24位数据的函数也行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
 楼主| 发表于 2014-4-9 14:52:11 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
大概明白,但是现在我发现只要写入寄存器,比如写FE45,示波器那边显示的就是FE45,FE00(00是硬件置位)。也就是说我还没来得及写第二次,他已经读了两次。很是无语啊!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-9 14:54:30 | 显示全部楼层
回复【3楼】herry2014:
---------------------------------
你的I2S芯片是不是可以设置16位数据格式的?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
 楼主| 发表于 2014-4-9 15:12:06 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
是的,你的意思是分两次发送吗?
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
 楼主| 发表于 2014-4-9 15:17:15 | 显示全部楼层
我也试了一下,比如要发送EF4567,按照24位打包进32位帧,高位在前。先发送0xEF45,然后发送0x6700。我写的函数是这样的,
void I2S_Send(uint32_t data)
{
     SPI->DR=(uint16_t)(data>>8);
     SPI->DR=(uint16_t)(data<<8);
}
但是出现的结果是一开始只发送EF45,到后面全发送6700。感觉应该不是这样写的,求老师指点!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-9 15:36:46 | 显示全部楼层
回复【6楼】herry2014:
---------------------------------
发送数据之前应该检查数据寄存器是不是空的,第一个数据发送完成后检查TXE位是否置1,清空之后再发送第二个16位数据
你按照下面的函数试下看下行不行

void I2S_Send(uint32_t data) 
{
     while(SPI->SR&(1<<7|1<<1)); 
     SPI->DR=(uint16_t)(data>>8); 
     while(SPI->SR&(1<<1));
     SPI->DR=(uint16_t)((data&0x000000ff)<<8); 
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
 楼主| 发表于 2014-4-9 16:10:41 | 显示全部楼层
解决了,十分感谢!
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-3-28
在线时间
0 小时
 楼主| 发表于 2014-4-10 09:38:13 | 显示全部楼层
擦,又出问题了,以为问题解决了,结果发现只有一次数据是对的,后面的又不对了。后面的好像还是只发送了6700,EF45都不发了!感觉就是我写入寄存器后,他就发送,还没来得及我写第二次,第一个数据已经按照24位打包32帧的格式发送过去了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-12 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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