打印

问个STM32 SPI的问题.

[复制链接]
3058|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
amixice|  楼主 | 2008-3-26 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这是一个SPI读写AT45DB32的函数
#define DUMMY_BYTE 0xA5
void Flash_ReadString(unsigned int pageaddr, unsigned int byteaddr, unsigned char *strp,unsigned char len)
{
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
    ENABLE_FLASH;
    SPI_Byte(0xE8);    //Continuous Array Read 
    SPI_Byte(HighByte(pageaddr));
    SPI_Byte(LowByte(pageaddr)+HighByte(byteaddr));
    SPI_Byte((unsigned char)byteaddr);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    for(; len; len--)
    {
        *strp++ = SPI_Byte(DUMMY_BYTE);
    }
    DISABLE_FLASH;
    return;
}

这个函数在C8051F023上成功.C8051F023的SPI Master模式, 发送一个数据的时候同时会吧MISO上的数据移进寄存器, 在发完的时候读取就可以.
unsigned char SPI_Byte(unsigned char databyte) reentrant
{
    SPI0DAT = databyte;
    while (TXBSY);        
    SPIF = 0;
    return SPI0DAT;    
}

在STM32F103上面也应该是这样的 我是这样实现的.
unsigned char SPI_Byte(unsigned char ch)
{
    SPI1->DR = ch;
    while((SPI1->SR & (~0x02)) == 0);//等待发送完成
    while((SPI1->SR & (~0x01)) == 0);//等待数据放入RX_Buf
    return SPI1->DR;
}
SPI的配置:
void SPI1_Config(void)
{
    SPI_InitTypeDef SPI_InitStruct;
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStruct.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStruct);
    //SPI_DMACmd(SPI1, SPI_DMAReq_Tx, ENABLE);
    SPI_Cmd(SPI1, ENABLE);
}


AT45DB32连续读操作要求在发送完地址后要发送32个CLK, 如下.
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
在C8051F023上没问题.

但是在STM32F103 我必须发送5个DUMMY_BYTE, 
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
    SPI_Byte(DUMMY_BYTE);
要不然每次读到的第一个数据都是0xFF, 第二个数据才是真正要读的第一个数据, 第一个数据并不是丢掉了.

沙发
amixice|  楼主 | 2008-3-26 14:47 | 只看该作者

.....

思维混乱.
    while((SPI1->SR & (~0x02)) == 0);//等待发送完成
    while((SPI1->SR & (~0x01)) == 0);//等待数据放入RX_Buf
应该是
    while((SPI1->SR & (0x02)) == 0);//等待发送完成
    while((SPI1->SR & (0x01)) == 0);//等待数据放入RX_Buf

使用特权

评论回复
板凳
香水城| | 2008-3-26 15:02 | 只看该作者

用示波器看过吗?

使用特权

评论回复
地板
amixice|  楼主 | 2008-3-27 10:24 | 只看该作者

对不起, 是我绕糊涂了.

2楼已解决

使用特权

评论回复
5
btyang| | 2009-9-7 09:10 | 只看该作者
重复发送数据是不是需要2楼那样判断??

使用特权

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

本版积分规则

13

主题

64

帖子

0

粉丝