金牌会员
- 积分
- 2140
- 威望
- 1099
- 贡献
- 575
- 兑换币
- 204
- 注册时间
- 2012-7-29
- 在线时间
- 233 小时
|
100贡献
本帖最后由 一坨飞奔de喵 于 2013-3-28 19:17 编辑
- // 初始化SD卡到SPI模式
- unsigned char SD_Reset()
- {
- unsigned char retry,temp;
- unsigned char i;
- unsigned char CMD0[] = {0x40,0x00,0x00,0x00,0x00,0x95};
- SD_CS_SetVal();
- for (i=0;i<10;i++)
- SD_SPI_SendChar(0xFF); //发送至少74个时钟信号
- SD_CS_ClrVal();
- //向SD卡发送CMD0
- retry=0;
- do
- {
- //为了能够成功写入CMD0,在这里写200次
- for(i=0;i<5;i++)
- SD_SPI_SendChar(0xFF); //发送至少16个时钟信号
- temp=Write_Command_SD(CMD0);
- retry++;
- if(retry==200)
- { //超过200次
- return(0x01);//CMD0 Error!
- }
- }
- while(temp!=0x01); //回应01h,停止写入
- SD_CS_SetVal();
- SD_SPI_SendChar(0xFF);
- return 0;
- }
- unsigned char SD_Init()
- {
- unsigned char retry,temp;
- unsigned char CMD1[] = {0x41,0x00,0x00,0x00,0x00,0xFF};
- //发送CMD1到SD卡
- SD_CS_ClrVal();
- retry=0;
- do
- { //为了能成功写入CMD1,写100次
- temp=Write_Command_SD(CMD1);
- retry++;
- if(retry==100)
- { //超过100次
- return(0x02);//CMD1 Error!
- }
- }
- while(temp!=0x00);//回应00h停止写入
- SD_CS_SetVal(); //片选无效
- SD_SPI_SendChar(0xFF);
- return(0); //初始化成功
- }
- //-----------------------------------------------------------------------------------------------
- // 向SD卡中写入命令,并返回回应的第二个字节
- //-----------------------------------------------------------------------------------------------
- unsigned char Write_Command_SD(unsigned char *CMD)
- {
- unsigned char *temp=0;
- unsigned char retry=0;
- unsigned char i;
- //禁止SD卡片选
- SD_CS_SetVal();
- //发送8个时钟信号
- SD_SPI_SendChar(0xFF);
- //使能SD卡片选
- SD_CS_ClrVal();
- //向SD卡发送6字节命令
- for (i=0;i<6;i++)
- {
- SD_SPI_SendChar(*CMD++);
- }
- //获得16位的回应
- SD_SPI_RecvChar(temp); //read the first byte,ignore it.
- do
- { //读取后8位
- SD_SPI_RecvChar(temp);
- retry++;
- }
- while((*temp==0xFF)&&(retry<100));
- return(*temp);
- }
- //--------------------------------------------------------------------------------------------
- // 写512个字节到SD卡的某一个扇区中去 返回0说明写入成功
- //--------------------------------------------------------------------------------------------
- unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)
- {
- unsigned char tmp,retry;
- unsigned char *temp=0;
- unsigned int i;
- //命令24
- unsigned char CMD24[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
- addr = addr << 9; //addr = addr * 512
- CMD24[1] = (unsigned char)((addr & 0xFF000000) >>24 );
- CMD24[2] = (unsigned char)((addr & 0x00FF0000) >>16 );
- CMD24[3] = (unsigned char)((addr & 0x0000FF00) >>8 );
- SD_CS_ClrVal();
- //写命令24到SD卡中去
- retry=0;
- do
- { //为了可靠写入,写100次
- tmp=Write_Command_SD(CMD24);
- retry++;
- if(retry==100)
- {
- return(tmp); //send commamd Error!
- }
- }
- while(tmp!=0);
- //在写之前先产生100个时钟信号
- for (i=0;i<100;i++)
- {
- SD_SPI_RecvChar(temp);
- }
- //写入开始字节
- //SD_CS_ClrVal();
- SD_SPI_SendChar(0xFE);
- //现在可以写入512个字节
- for (i=0;i<512;i++)
- {
- SD_SPI_SendChar(Buffer[i]);
- }
- //CRC-Byte
- SD_SPI_SendChar(0xFF); //Dummy CRC
- SD_SPI_SendChar(0xFF); //CRC Code
- SD_SPI_RecvChar(temp); // read response
- if((*temp & 0x1F)!=0x05) // 写入的512个字节是未被接受
- {
- SD_CS_SetVal();
- return(0x03); //Error!
- }
- //等到SD卡不忙为止
- //因为数据被接受后,SD卡在向储存阵列中编程数据
- do
- {
- SD_SPI_RecvChar(temp);
- }
- while (*temp!=0xFF) ;
- //禁止SD卡
- SD_CS_SetVal();
- SD_SPI_SendChar(0xFF);
- return(0);//写入成功
- }
复制代码 根据网上的操作改的,用的是DSC系列的芯片,MC56F8013。
没有打算用文件系统,只想简单地把数据写入扇区,可是弄了一周了,完全没有反应。。。
PS:用的winhex查看的,数据一点儿也没有改变。。。
求助各位大神,小弟拜谢了。。。
补充内容 (2013-3-28 20:57):
SPI的配置在八楼,谢谢 |
最佳答案
查看完整内容
用winhex看看又没有数据写进去,我很久之前写的,找个程序给你看看,128的
|