首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI始终读取0

SPI始终读取0
EN

Stack Overflow用户
提问于 2020-10-01 00:08:20
回答 2查看 182关注 0票数 0

我正在尝试使用SPI接口与SPI ADXL345传感器和STM32F072核心板。我想做一个非常基本的读取operation.Now读取功能在等待RXNE signal.But RXNE从未设置。SPI始终读取0。我使用IAR这里是我的代码,我使用这些函数来写和读SPI。

代码语言:javascript
复制
int main()
{

    USART2_Init();
    SPIx_Init();

    while (1) {
        adxl_baslat();
        receiveData[0] = readData(0x32);
        receiveData[1] = readData(0x33);
        receiveData[2] = readData(0x34);
        receiveData[3] = readData(0x35);
        receiveData[4] = readData(0x36);
        receiveData[5] = readData(0x37);

        x = (receiveData[1] << 8) | (receiveData[0]);
        y = (receiveData[3] << 8) | (receiveData[2]);
        z = (receiveData[5] << 8) | (receiveData[4]);
        xg = (float)x * 0.0078;
        yg = (float)x * 0.0078;
        zg = (float)x * 0.0078;
        sprintf(buffer, "xg: %f yg: %f zg: %f \r\n", xg, yg, zg);
        USART_PutString(buffer);
    }
}

void SPIx_Init()
{

    SPI_InitTypeDef SPI_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
    SPI_Init(SPI1, &SPI_InitStruct);
    SPI_Cmd(SPI1, ENABLE);
    SPI_DataSizeConfig(SPI1, ENABLE);
    SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

    // Step 2: Initialize GPIO
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // GPIO pins for MOSI, MISO, and SCK
    GPIO_InitStruct.GPIO_Pin = SPI_PIN_MOSI | SPI_PIN_MISO | SPI_PIN_SCK;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_1);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = SPI_PIN_SS;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOB, &GPIO_InitStruct);
}

uint8_t sendByte(uint8_t byteToSend)
{
    timeout = TIMEOUT_TIME;
    while ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) & (timeout != 0)) {
        timeout--;
    }
    SPI_SendData8(SPI1, byteToSend);
    timeout = TIMEOUT_TIME;
    while ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) & (timeout != 0)) {
        timeout--;
    }
    return (uint8_t)SPI_ReceiveData8(SPI1);
}

void writeData(uint8_t address, uint8_t dataToWrite)
{

    DATA2 = address | 0x40;
    GPIO_ResetBits(GPIOB, GPIO_Pin_9);
    sendByte(DATA2);
    sendByte(dataToWrite);

    GPIO_SetBits(GPIOB, GPIO_Pin_9);
}

uint8_t readData(uint8_t address)
{
    address |= 0x40;
    address |= 0x80;
    GPIO_ResetBits(GPIOB, GPIO_Pin_9);
    sendByte(address);
    tempByte = sendByte(address);
    GPIO_SetBits(GPIOB, GPIO_Pin_9);
    return tempByte;
}

void adxl_baslat(void)
{
    writeData(0x31, 0x01);
    writeData(0x2d, 0x00);
    writeData(0x2d, 0x08);
}
EN

回答 2

Stack Overflow用户

发布于 2020-10-02 08:05:08

您的初始化看起来相当完整,但我发现了一个错误: GPIO引脚A5/A6/A7需要设置为GPIO_AF_0 (而不是GPIO_AF_1),以便在这些引脚上获得SPI1 SCK/MISO/MOSI (参见STM32F072数据表表15)。这就是为什么您可以从RX FIFO读取始终为零的原因。

不过,我有点想知道RXNE标志没有被设置。在全双工主机模式下,即使GPIO引脚配置不正确,SPI单元也应为发送的每个字节接收一个字节。但我认为STM32F0处理这种情况的方式与老式的STM32L1不同:当我没记错的时候,我确实注意到在STM32F0上,SPI接收器似乎是从GPIO引脚获得时钟信号,而不是直接从SPI发送器(产生它)获得时钟信号。因此,错误配置的SCK引脚也可能解释SPI RX单元根本不接收任何东西。

票数 0
EN

Stack Overflow用户

发布于 2020-10-02 19:32:36

需要清除接收FIFO或DR,然后才能接收有意义的数据

代码语言:javascript
复制
uint8_t sendByte(uint8_t byteToSend)
{
    timeout = TIMEOUT_TIME;
    while ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESET) 
    {
        uint8_t dummy;
        dummy = *(volatile uint8_t *)&SPI1 -> DR;
    }
    timeout = TIMEOUT_TIME;
    while ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) & (timeout != 0)) {
        timeout--;
    }
    SPI_SendData8(SPI1, byteToSend);
    timeout = TIMEOUT_TIME;
    while ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) & (timeout != 0)) {
        timeout--;
    }
    return (uint8_t)SPI_ReceiveData8(SPI1);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64141532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档