打印
[牛人杂谈]

使用U盘例程、Nano130板做U盘和读卡器

[复制链接]
楼主: 与时俱进
手机看帖
扫描二维码
随时随地手机跟帖
101
与时俱进|  楼主 | 2014-7-14 23:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
应该是先把外接FLASH的读写程序调试通过吧。

使用特权

评论回复
102
与时俱进|  楼主 | 2014-7-14 23:58 | 只看该作者
uopy2002 发表于 2014-7-14 19:56
你好,我是詢問u盤如何進行改寫的人
因為我是新接觸韌體撰寫的人,所以很多東西都不是如此清楚
我是用新唐n ...

“不過目前我僅改寫 板主一開始說的SIZE大小(16g那個)和讀寫區塊(DataFlashPro.c)的部分”---这样就差不多了。
对于USB的调试,可以用BUS HOUND软件。

使用特权

评论回复
103
gxliu08| | 2014-7-15 10:55 | 只看该作者
学习学习!

使用特权

评论回复
104
uopy2002| | 2014-7-16 19:26 | 只看该作者
本帖最后由 uopy2002 于 2014-7-16 19:28 编辑

所以假設我DataFlashProg.c部分
更改到剩下如下(由SPI範例 更改部分為unit8_buffer 改為 unit32_t buffer)
SPI初始等等已經作好(有特別在UDC_Main.c 多去寫 u16Id = spiFlashReadID() 回傳正常)

void DataFlashRead(uint32_t addr, uint32_t size, uint32_t buffer)
{
    int32_t len;
    len = (int32_t)size;
  spiFlashReadData(addr, len, (uint32_t *)buffer);
}
void DataFlashWrite(uint32_t addr, uint32_t size, uint32_t buffer)
{
    int32_t len ;  
    len = (int32_t)size;
                spiFlashPageProgram(addr, len, (uint32_t *)buffer);
}

之後只要調整usb協定 UDC_Class.c和 nanolxx.usb部分理應可以如版主一樣成功?!
因為目前我是可以開啟 但無法格式化 也無法知道它型式 大小
跟版主一開始有點類似 但沒有raw這個

使用特权

评论回复
105
373810773| | 2014-7-16 21:08 | 只看该作者
通宵敲代码 发表于 2014-6-26 20:28
怪不得昨天那么积极,回复了我九条信息!

呵呵

使用特权

评论回复
106
与时俱进|  楼主 | 2014-7-17 22:51 | 只看该作者
你把buffer做了强制类型转换?

使用特权

评论回复
107
uopy2002| | 2014-7-18 09:35 | 只看该作者
讀取部分:
uint8_t spiFlashReadData(uint32_t spiAddr, uint32_t DataLen, uint32_t *pDataBuf)
{
        uint32_t i;
        if(TempSpiPort == NULL)
                return SPI_FLASH_ERROR;
       
        if(SPI_IsBusy(TempSpiPort)== TRUE)
                return SPI_FLASH_ERROR;
       
        // command (8bit)       
        SPI_SetBitLength(TempSpiPort, 8);
        spiTxData[0] = SPI_FLASH_CMD_READ_DATA;       
        SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
       
        SPI_SetSS(TempSpiPort, SPI_SS0);
        SPI_SetGo(TempSpiPort);
        while(SPI_IsBusy(TempSpiPort));
               
        // address (24bit)
        SPI_SetBitLength(TempSpiPort, 24);
        spiTxData[0] = spiAddr;
        SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
        SPI_SetGo(TempSpiPort);
        while(SPI_IsBusy(TempSpiPort));
       
        // data (32bit*n)//更改部分 8->32
        SPI_SetBitLength(TempSpiPort, 32);
        spiTxData[0] = 0xffffff;
        for (i=0; i<DataLen; i++)
        {
                SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
                SPI_SetGo(TempSpiPort);
                while(SPI_IsBusy(TempSpiPort));
                SPI_DumpRxRegister(TempSpiPort, &spiRxData[0], 1);
               
                *(pDataBuf++) = spiRxData[0]&0xffffff;
               
        }
        SPI_ClrSS(TempSpiPort, SPI_SS0);
        return SPI_FLASH_DONE;
}

使用特权

评论回复
108
uopy2002| | 2014-7-18 09:39 | 只看该作者
撰寫部分  最主要將256改為64(因為原本8bit轉成32bit)   Address部分 因為還是一頁所以256不動(因為ICU 一個PAGE 256BYTE)

uint8_t spiFlashPageProgram(uint32_t spiAddr, uint32_t DataLen, uint32_t *pDataBuf)
{
        uint32_t PageCount, ByteCount, i;
       
        if(TempSpiPort == NULL)
                return SPI_FLASH_ERROR;
       
        if(SPI_IsBusy(TempSpiPort)== TRUE)
                return SPI_FLASH_ERROR;
       
        PageCount = DataLen / 64;
       
        if ((DataLen % 64) != 0)
                PageCount++;
       
        for (i=0; i<PageCount; i++)
        {               
                spiFlashWriteEnable();
               
                if(DataLen > 64)
                {       
                        ByteCount = 64;
                        DataLen -= 64;
                }
                else
                        ByteCount = DataLen;
                       
                // command (8bit)       
                SPI_SetBitLength(TempSpiPort, 8);
                spiTxData[0] = SPI_FLASH_CMD_PAGE_PROGRAM;       
                SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
               
                SPI_SetSS(TempSpiPort, SPI_SS0);
                SPI_SetGo(TempSpiPort);
                while(SPI_IsBusy(TempSpiPort));
       
                // address (24bit)
                SPI_SetBitLength(TempSpiPort, 24);
                spiTxData[0] = spiAddr+i*256;
                SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
                SPI_SetGo(TempSpiPort);
                while(SPI_IsBusy(TempSpiPort));
               
                while(ByteCount --)
                {
                        // data (32bit*n)
                        SPI_SetBitLength(TempSpiPort, 32);
                        spiTxData[0] = *(pDataBuf++);
                        SPI_SetTxRegister(TempSpiPort, &spiTxData[0], 1);
                        SPI_SetGo(TempSpiPort);
                        while(SPI_IsBusy(TempSpiPort));
                }
                SPI_ClrSS(TempSpiPort, SPI_SS0);
               
                spiFlashCheckBusy();               
        }       
       
        return SPI_FLASH_DONE;
}

使用特权

评论回复
109
uopy2002| | 2014-7-18 09:45 | 只看该作者
以上更改主要由SAMPLE CODE SPI更改 其中外接IC 為 W25Q32BV 同一系列
而UDC讀寫BUFFER為32BIT 而SPI原為8BIT傳輸最高也可為32BIT傳輸 因此最更改

主要調整最後傳輸大小  Data 8bit -> Data 32bit 以及PAGE ADDRESS 部分

MAIN已初始化SPI功能

使用特权

评论回复
110
与时俱进|  楼主 | 2014-7-19 14:32 | 只看该作者
就是这样的。
你上面这两个子程序检验过了吗?可以借助半主机调试,先检验读写FLASH子程,排除这些因素,再去调试USB。
USB调试可以借助于BUS HOUND,可以拿U盘和你做的东东做比较,观察BUS HOUND反映的信息有哪些不同。我当时调试最简USB转串口时,就是用这种方法,发现例程缺少对SET_LINE_CODE命令的回应。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
uopy2002 + 1 赞一个!
111
zxf0168| | 2014-7-19 20:48 | 只看该作者
mintspring 发表于 2014-7-1 19:50
呵呵,太小了,我这64G的u盘可怎么用啊。

有本事你给我做个大的

使用特权

评论回复
112
骗子的片子| | 2014-8-22 22:02 | 只看该作者
通宵敲代码 发表于 2014-5-31 10:04
努力是必须的!不过,
这学期研究上linux了,
不怎么搞单片机了!

竟然搞linux了

使用特权

评论回复
113
骗子的片子| | 2014-8-22 22:02 | 只看该作者
与时俱进 发表于 2014-7-19 14:32
就是这样的。
你上面这两个子程序检验过了吗?可以借助半主机调试,先检验读写FLASH子程,排除这些因素,再 ...

额,学习了

使用特权

评论回复
114
骗子的片子| | 2014-8-22 22:08 | 只看该作者
通宵敲代码 发表于 2014-6-25 23:15
的确,一个人再有精力,也拼不过全球的程序员啊!

错了,Linux只是个工具

使用特权

评论回复
115
通宵敲代码| | 2014-8-23 14:13 | 只看该作者
骗子的片子 发表于 2014-8-22 22:02
竟然搞linux了

装装B

使用特权

评论回复
116
骗子的片子| | 2014-9-18 21:49 | 只看该作者
通宵敲代码 发表于 2014-8-23 14:13
装装B

linux的宗旨可不是装B

使用特权

评论回复
117
通宵敲代码| | 2014-9-19 17:59 | 只看该作者
骗子的片子 发表于 2014-9-18 21:49
linux的宗旨可不是装B

:lol这倒是,linux实用性还是挺强的!

使用特权

评论回复
118
骗子的片子| | 2014-9-24 14:59 | 只看该作者
通宵敲代码 发表于 2014-9-19 17:59
这倒是,linux实用性还是挺强的!

赞成

使用特权

评论回复
119
与时俱进|  楼主 | 2018-1-16 20:18 | 只看该作者
几年过去,都忘记了,呵呵。
网帖竟然成了学习笔记。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则