OpenEdv-开源电子网

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

IO口模拟SPI,没能成功

[复制链接]

5

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-20
在线时间
0 小时
发表于 2014-5-21 23:32:11 | 显示全部楼层 |阅读模式
5金钱
我用stm8的IO口模拟SPI通信,RC522读写寄存器函数如下:
往RC522寄存器里写数据,读出来的却与写进去的不相同。天线有13.56Mhz射频输出,请问这样的程序能否模拟SPI的通信。这里人气旺,希望能得到指点。感谢!!
[mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]//功 能:写RC632寄存器 //参数说明:Address[IN]:寄存器地址 // value[IN]:写入的值 void WriteRawRC(unsigned char Address, unsigned char value) { unsigned char i, ucAddr; GPIO_WriteLow(GPIOD, MF522_SCK); //时钟 GPIO_WriteLow(GPIOA,MF522_NSS); //片选 ucAddr = ((Address<<1)&0x7E); for(i=8;i>0;i--) { if((ucAddr&0x80)==0x80) { GPIO_WriteHigh(GPIOC,MF522_SI); //主机输出 从机输入  [/mw_shl_code] [mw_shl_code=c,true] } else { GPIO_WriteLow(GPIOC,MF522_SI); } GPIO_WriteHigh(GPIOD,MF522_SCK); ucAddr <<=1; GPIO_WriteLow(GPIOD,MF522_SCK); } for(i=8;i>0;i--) { if((value&0x80)==0x80) { GPIO_WriteHigh(GPIOC, MF522_SI); } else { GPIO_WriteLow(GPIOC, MF522_SI); } nop(); nop(); GPIO_WriteHigh(GPIOD, MF522_SCK); value <<=1; GPIO_WriteLow(GPIOD, MF522_SCK); } GPIO_WriteHigh(GPIOA,MF522_NSS); GPIO_WriteHigh(GPIOD,MF522_SCK ); } unsigned char ReadRawRC(unsigned char Address) { unsigned char i, ucAddr; unsigned char ucResult=0; GPIO_WriteLow(GPIOD,MF522_SCK ); //时钟 GPIO_WriteLow(GPIOA,MF522_NSS); //片选 ucAddr = ((Address<<1)&0x7E)|0x80; for(i=8;i>0;i--) { if((ucAddr&0x80)==0x80) { GPIO_WriteHigh(GPIOC,MF522_SI ); //主机输出,从机输入 } else { GPIO_WriteLow(GPIOC, MF522_SI); //主机输出,从机输入 } GPIO_WriteHigh(GPIOD,MF522_SCK ); ucAddr <<= 1; GPIO_WriteLow(GPIOD, MF522_SCK); } for(i=8;i>0;i--) { GPIO_WriteHigh(GPIOD,MF522_SCK ); ucResult <<= 1; ucResult|= (BitStatus)(GPIO_ReadInputPin(GPIOC, MF522_SO)); GPIO_WriteLow(GPIOD, MF522_SCK); } GPIO_WriteHigh(GPIOA,MF522_NSS); GPIO_WriteHigh(GPIOD,MF522_SCK ); return ucResult; }[/mw_shl_code]

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

使用道具 举报

10

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2013-7-8
在线时间
7 小时
发表于 2014-5-23 15:41:26 | 显示全部楼层
RC522我用过,记得当时是用I2C接口的。模拟时序和硬件I2C都可以。你这问题,1.用示波器观察一下时序,看看数据对不对  2.你读的RC522的寄存器是可读的吗? 3.读写不一样,看看是写寄存器出了问题,还是读寄存器出了问题。发个命令关闭载波,看看有没有反应。。。。。
回复

使用道具 举报

5

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-20
在线时间
0 小时
 楼主| 发表于 2014-5-23 20:28:29 | 显示全部楼层
回复【2楼】penguin_boar:
---------------------------------
感谢你的回复   我今天用逻辑分析仪测试了,写寄存器没有问题,逻辑分析仪上可以观察到写寄存器的地址和数据值,可能是读寄存器那块有问题。 其实我也不确定 ucResult|= (BitStatus)(GPIO_ReadInputPin(GPIOC, MF522_SO));  这个语句能否读出MF522_SO的电平值。这是stm8库里的函数,请问这个可以获得电平值吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 22:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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