OpenEdv-开源电子网

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

SPI发送汉字怎么发送呢?求大神

[复制链接]

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-7-7 17:01:22 | 显示全部楼层 |阅读模式
5金钱
SPI是发送按8位或者16位进行发送的。汉字是2个字节,也就是八位,故设置为16位进行发送
但是接收到的数据不是那样的
SPI1为主机    SPI2为从机    
[mw_shl_code=c,true]char SPI2_Buffer_Tx[size] = "原子帅哥"; while(Tx_Idx<size) { /* 等待 SPI1 发送缓冲空 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); /* SPI1 发送数据 */ SPI_I2S_SendData(SPI1, SPI2_Buffer_Tx[Tx_Idx++]); /* 等待 SPI2 接收数据完毕 */ while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); /* 读出 SPI2 接收的数据 */ SPI2_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI2); } printf("SPI2 data is %s\n",SPI2_Buffer_Rx);[/mw_shl_code]


大神,该怎么发送汉字呢?

愈挫愈勇
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 17:53:20 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-7-7 18:13:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
SPI1为主机,SPI2为从机
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-7-7 19:35:48 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我可以实现发送汉字,但是我这里有困惑了,我用DMA将内存中的数据发送给SPI1,是一次性发给SPI1呢,还是每个字节发送呢?这时候时钟是怎么样产生的呢?也就是SPI2该怎么接受呢?谢谢原子哥。下面是我困惑的代码
MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DR,(u32)p,2); //       这里后面的字节数应该是2呢还是全部数组的大小呢?
我两个都试过,就是SPI2接受数据时候出错了,接到了乱码
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-7-7 19:37:22 | 显示全部楼层
[mw_shl_code=c,true] while(Tx_Idx < BufferSize) { /* 等待 SPI2 发送缓冲空 */ while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); /* SPI2 发送数据,等待主机SPI1的发送,可以产生时钟脉冲 */ SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]); /* 等待 SPI1 发送缓冲空 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); /* SPI1 发送数据 */ // SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx++]); //(用DMA的方式进行发送) MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DR,(u32)p,2); //DMA从内存读取数据传输给SPI1,进行发生 printf("DMA send is %s\n",*p++); //测试是否可以从DMA发生数据 SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //使能SPI1的DMA发送请求 MYDMA_Enable(DMA1_Channel3); //开启一次DMA传输 /* 等待 SPI1 接收数据完毕 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); /***********SPI1_RX接收*****************/ SPI1_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI1); printf("SPI1_Buffer_Rx[%d] is %d\n",i++,SPI1_Buffer_Rx[Rx_Idx]); /* 等待 SPI2 接收数据完毕 */ while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); /* 读出 SPI2 接收的数据 */ SPI2_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI2); // printf("SPI2_Buffer_Rx[%d] is %d\n",j++,SPI2_Buffer_Rx[Rx_Idx++]); printf("\n"); } [/mw_shl_code]

愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 23:40:47 | 显示全部楼层
这种自发自收,我没有搞过哦。
产生时钟的原则,就是SPI->DR里面有内容,主机SPI就会产生时钟,一旦SPI DR里面没内容 了,就不会产生时钟了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-6 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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