完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
就是实现很简单的步骤,SD卡采用SPI通信模式,写一个数据进去,然后把它读出来,数据时肯定写进去了,但是读出来每次都是0x09,只有当单步调试的时候,一步一步走,读出来的数据才是符合要求的,很奇怪,是什么原因造成的呢?
|
|
相关推荐
33个回答
|
|
|
|
|
|
这是主程序、、
#include #include"sys.h" #include"delay.h" #include"lcd.h" #define cs Aout(3) u8 buf[550]; u8 send(u8 da); void spi_init(void); void spi_speed(u8); u8 init_SD(void); void SD_select(void); u8 send_com(u8 com, u32 arg, u8 crc); u8 SD_read(void); void dis(u16); void init_usart(void); int main(void) { u8 r; u16 i; Stm32_Clock_Init(9); delay_init(72); LCD_Init(); init_usart(); r = init_SD(); while(1) { if (r == 0) { LCD_ShowString(50, 50, "not found"); } if (r == 1) { LCD_ShowString(50, 50, "found SD!"); SD_read(); for(i = 0; i < 523; i++) { USART1->DR = buf; while(!(USART1->SR & (1 << 6))); USART1->SR &= ~(1 << 6); } dis(0); while(1); } delay_ms(1000); r = init_SD(); } } |
|
|
|
|
|
|
|
|
|
|
|
上图是在这个接收函数下的,之前那个读函数读出来的数据不能直观说明问题
u8 SD_read(void) { u8 r1, t, res; u16 i; r1 = send_com(17, 0, 0x01); if (r1 == 0) { t = 0xff; do { res = send(0xfe); t--; }while(res != 0xfe && t); for (i = 0; i < 523; i++) { delay_us(5); buf = send(0xff); } send(0xff); send(0xff); cs = 1; send(0xff); return 1; } return 0; } |
|
|
|
u8 send(u8 da)
{ while((SPI1->SR & 1 << 1) == 0); SPI1->DR = da; while((SPI1->SR & 1 << 0) == 0); return SPI1->DR; } 这个函数里的操作顺序对吗? 编辑,我弄错了还以为SPI1->SR & 1 << 1必须加上SPI1->SR &( 1 << 1),c语言从右向左 的 |
|
|
|
|
|
|
|
大哥,小生我求求你看看嘛,我这两天都快被这东西弄疯了
|
|
|
|
|
|
|
|
是不是读的太早了,这个函数如果t超时了,就读取数据了
u8 SD_read(void) { u8 r1, t, res; u16 i; r1 = send_com(17, 0, 0x01); //发送读指令,从扇区0开始 if (r1 == 0) { t = 0xff; do { res = send(0xfe); t--; }while(res != 0xfe && t); //检验起始令牌 // for (i = 0; i < 512; i++) //开始读数据 { buf = send(0xff); } send(0xff); send(0xff); cs = 1; send(0xff); return 1; } return 0; } |
|
|
|
学长 还是不对
u8 SD_read(void) { u8 r1, t, res; u16 i; r1 = send_com(17, 0, 0x01); if (r1 == 0) { t = 0xff; do { res = send(0xfe); t--; }while(res != 0xfe && t); delay_us(150);//此处添加了150us的延时 for (i = 0; i < 523; i++) { buf = send(0xff); } send(0xff); send(0xff); cs = 1; send(0xff); return 1; } return 0; } 我那儿再延时读出来的数据也是错的、、、~~学长 我被SD卡弄怕了 |
|
|
|
|
|
|
|
|
|
|
|
原子大哥,我直接用你的代码,可以读出来,但是如果将你的读取那个函数移植到我那个程序上面去,就还是不得行,我最怕的是我初始化程序会出错,但是我左检查右检查,都没的办法、我只好暂时放放它了
|
|
|
|
只有小组成员才能发言,加入小组>>
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
528 浏览 2 评论
550 浏览 2 评论
信号发生器产生的正弦频率信号,用定时器进行捕获,当幅值低于3V后为什么MCU就无法捕获到了?
209 浏览 2 评论
875 浏览 2 评论
编码器模式下,中断内访问其他定时器cnt值,会导致进入中断次数丢失的原因?
859 浏览 2 评论
1331浏览 9评论
STM32出现error downloading following files怎么解决?
29浏览 3评论
stm32f103的RST复位后PWM就停止输出了,为什么?
37浏览 3评论
STM32G0空闲中断异常,且DMA接收不到数据是怎么回事?
24浏览 3评论
STM32F103用Timer3TRGO通道触发ADC,ADC在三路输出PWM高电平中间点采样,如何配置?
15浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-29 06:04 , Processed in 0.665664 second(s), Total 86, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号