完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
![]()
|
|
相关推荐
19个回答
|
|
INT8U NFC_MISO_Status(void)
{ if(gpio_read_io(NFC_MISO)) return 1; else return 0; } INT8U NFC_SPI_ReadByte(void) { INT8U rByte=0; INT8U i; gpio_write_io(NFC_NSS, DATA_LOW); for(i=0;i<8;i++) { gpio_write_io(NFC_SCK, DATA_LOW); TimerDelayus(2); rByte<<=1; if(NFC_MISO_Status()) rByte|=1; gpio_write_io(NFC_SCK, DATA_HIGH); TimerDelayus(8); } gpio_write_io(NFC_SCK, DATA_LOW); return rByte; } void NFC_SPI_WriteByte(INT8U wByte) { INT8U i; gpio_write_io(NFC_NSS, DATA_LOW); for(i=0;i<8;i++) { gpio_write_io(NFC_SCK, DATA_LOW); TimerDelayus(8); if(wByte&0x80) { gpio_write_io(NFC_MOSI, DATA_HIGH); } else { gpio_write_io(NFC_MOSI, DATA_LOW); } wByte=wByte<<1; gpio_write_io(NFC_SCK, DATA_HIGH); TimerDelayus(2); } gpio_write_io(NFC_SCK, DATA_LOW); //gpio_write_io(NFC_NSS, DATA_HIGH); } /* ** function : NFC_AM4K_WriteReg ** return: None ** parameter: (1)INT8U addr--addr ** (2)INT8U value--write value */ void NFC_AM4K_WriteReg(INT8U addr, INT8U value) { gpio_write_io(NFC_NSS, DATA_LOW); //CS low NFC_SPI_WriteByte(addr&0x7F); //SPI write addr NFC_SPI_WriteByte(value); //SPI write data gpio_write_io(NFC_NSS, DATA_HIGH); //CS high } /****************** * * function name:NFC_AM4K_ReadReg * * return: value - read the register values * * reference number, addr - register address * * said: NFC_AM4K register read function ************************************/ INT8U NFC_AM4K_ReadReg(INT8U addr) { INT8U value; gpio_write_io(NFC_NSS, DATA_LOW); //CS low NFC_SPI_WriteByte(addr|0x80); //SPI write addr value = NFC_SPI_ReadByte(); //SPI write data gpio_write_io(NFC_NSS, DATA_HIGH); //CS high return value; }
最佳答案
|
|
|
|
楼主你好 你的图片显示有问题 希望你可以用编辑器里的图片工具重新上传哦!
|
|
|
|
这个楼主你的图片挂了
|
|
|
|
SCK是时钟,当然得高低变化的,MOSI MISO一个是写,一个是读,你看是时钟上升沿有效还是下降沿有效就可以了
|
|
|
|
SPI时序问题,摆渡可解。
|
|
|
|
你的图片有问题,我们看不到啊。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以上是 SPI 读写
自己参考 这个是写函数 把数据value写到addr地址 void NFC_AM4K_WriteReg(INT8U addr, INT8U value) { gpio_write_io(NFC_NSS, DATA_LOW); //CS low NFC_SPI_WriteByte(addr&0x7F); //SPI write addr NFC_SPI_WriteByte(value); //SPI write data gpio_write_io(NFC_NSS, DATA_HIGH); //CS high } /****************** * * function name:NFC_AM4K_ReadReg * * return: value - read the register values * * reference number, addr - register address * * said: NFC_AM4K register read function ************************************/ 这是读函数 从地址addr里读取 INT8U NFC_AM4K_ReadReg(INT8U addr) { INT8U value; gpio_write_io(NFC_NSS, DATA_LOW); //CS low NFC_SPI_WriteByte(addr|0x80); //SPI write addr value = NFC_SPI_ReadByte(); //SPI write data gpio_write_io(NFC_NSS, DATA_HIGH); //CS high return value; } |
|
|
|
你应该还不会看时序图吧,你可以百度一下时序图,百度百科讲得很明白。
|
|
|
|
这是一个flash的时序图,我们读取时序图的时候要遵循,从上到下,从左到右,最上面的csn代表控制端,类似于cs端,低电平有效,再下来sck是时钟,然后mosi和moso,一个是命令地址等,一个是发送数据。接着我们从左到右,csn为低电平有效,然后时钟也有效,mosi发送一段地址或者命令,miso发送了一段数据。然后自己按照楼上给的程序一步步看吧
|
|
|
|
以上是 SPI 读写
|
|
|
|
时序是从左往右读的,图中的意思的,CSN拉低后开始进行SPI的操作,SPI读取数据是先需要向从设备发送一个字节的读取指令(暂时这么叫吧),即图中的MOSI部分的前八个脉冲(图中描述为C0~C7),此时MISO为(S0~S7)随机状态,然后从设备向主设备发送两个字节,低字节在前。上述中,发送和接收都需要有时钟脉冲的,也就是图中的CLK部分。数据帧结束后,CSN拉高,表示当前数据帧发送或者接收完成了。
|
|
|
|
|
|
|
|
在CSN片选选中后(低电平)后,先发数据,后拉高时钟,此时的数据有效。简单来说就是在sck时钟上升沿时,数据线上的数据才有效。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
零知开源——基于STM32F407VET6零知增强板的四路独立计时器
1651 浏览 0 评论
零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能
1735 浏览 0 评论
CW32L010 ESC Driver 电机控制套件快速上手指南
1269 浏览 1 评论
2084 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
13708 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-7-13 02:39 , Processed in 0.901953 second(s), Total 75, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191