OpenEdv-开源电子网

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

求大伙帮我看一下这个SPI的配置哪里出了问题

[复制链接]

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
发表于 2015-12-9 10:22:20 | 显示全部楼层 |阅读模式
5金钱
我想用两个STM8S单片机实现SPI通讯,主机的程序为:
[mw_shl_code=c,true]int main(void) { CLK_HSICmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /*设置内部时钟16M为主时钟*/ GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_FL_NO_IT); SPI_DeInit(); SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_256, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_HARD, 0x07); SPI_Cmd(ENABLE); while (1) { SPI_SendData(0x88); delay_ms(4000); } }[/mw_shl_code]
从机的程序为:
[mw_shl_code=c,true]int main(void) { CLK_HSICmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /*设置内部时钟16M为主时钟*/ Uart_Init(); GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST); SPI_DeInit(); SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_256, SPI_MODE_SLAVE, SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_1LINE_RX, SPI_NSS_HARD, 0x07); SPI_Cmd(ENABLE); while (1) { while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == SET); printf("%d",SPI_ReceiveData()); delay_ms(4000); } }[/mw_shl_code]
但是在串口那边收到的一直是零,这是哪里配置出了问题呢
敢想敢为,敢做敢当。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2015-12-9 10:36:30 | 显示全部楼层
从机的SCK应设为输入,但是改过之后结果还是一样。
敢想敢为,敢做敢当。
回复

使用道具 举报

58

主题

6289

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11357
金钱
11357
注册时间
2014-4-1
在线时间
1270 小时
发表于 2015-12-9 11:30:30 | 显示全部楼层
从机是被动一方,不知道主机什么时候发起通信。
所以,从机要提前把数据准备好,随时恭候主机来取。
似乎你没有这一步,从机把默认值(即0)发出去了。

可能是这问题。
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2015-12-9 11:50:14 | 显示全部楼层
回复【3楼】xuande:
---------------------------------
我的串口打印的是从机接收到的数据呀,不过我那个NSS引脚的处理是主机接VCC,从机接VSS,这样应该没问题的吧?
敢想敢为,敢做敢当。
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2015-12-10 14:25:06 | 显示全部楼层
改了两个地方,从机可以收到数据了,第一:SPI_init()函数之前要先把SPI功能关闭掉
                                                    第二:将NSS引脚设置为浮空输入。
但是出现了新的问题,就是从机收到的数据不正确,例如发送的是0x10001000,从机收到的可能是0x00010001也可能是0x01000100,
就是发生了一个不确定的移位,先结帖吧,慢慢研究了。
敢想敢为,敢做敢当。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-9-30 04:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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