1

我正在使用 bit banging 来控制 SSI 上的引脚,以实现可切换的 microwire/spi。我可以将数据发送到 eeprom(控制+地址),芯片选择配置正确,但没有输出。配置代码为:

    // SSI SPI initialization

    ulClkGPIO = GPIO_PORTA_BASE + (GPIO_PIN_2 << 2);
    ulFssGPIO = GPIO_PORTA_BASE + (GPIO_PIN_7 << 2);
    ulRxGPIO = GPIO_PORTA_BASE + (GPIO_PIN_4 << 2);
    ulTxGPIO = GPIO_PORTA_BASE + (GPIO_PIN_5 << 2);

    MAP_GPIOPinTypeGPIOOutput(ulFssGPIO & 0xfffff000,
                                  (ulFssGPIO & 0x00000fff) >> 2);

    //
    // Set the Fss pin high.
    //
    HWREG(ulFssGPIO) = 255;

    //
    // Configure the Clk pin.
    //
    MAP_GPIOPinTypeGPIOOutput(ulClkGPIO & 0xfffff000,
                              (ulClkGPIO & 0x00000fff) >> 2);

    //
    // Set the Clk pin low
    //
    HWREG(ulClkGPIO) = 0;

    //
    // Configure the Tx pin and set it high.
    //
    MAP_GPIOPinTypeGPIOOutput(ulTxGPIO & 0xfffff000,
                              (ulTxGPIO & 0x00000fff) >> 2);
    HWREG(ulTxGPIO) = 255;

    //
    // Configure the Rx pin.
    //
    MAP_GPIODirModeSet(ulRxGPIO & 0xfffff000,
                       (ulRxGPIO & 0x00000fff) >> 2, GPIO_DIR_MODE_IN);
    MAP_GPIOPadConfigSet(ulRxGPIO & 0xfffff000,
                         (ulRxGPIO & 0x00000fff) >> 2,
                         GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
//    MAP_GPIOPinTypeGPIOInput(ulRxGPIO & 0xfffff000,
//                             (ulRxGPIO & 0x00000fff) >> 2);

对于 I2C,我使用硬件外围设备,一切正常。下面是 spi 上字节写入和字节读取的位碰撞。

void sendSPIByte(unsigned char data)
{
    unsigned char count;
    for(count = 0; count < 8; count++) {
        HWREG(ulTxGPIO) = (data & 0x80) ? 255 : 0;
        data <<= 1;
        SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
        HWREG(ulClkGPIO) = 255;
        SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
        HWREG(ulClkGPIO) = 0;
        SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
    }
}

unsigned char getSPIByte(void) {
    unsigned char count;
    unsigned char data;
    data = 0;
    for(count = 0; count < 8; count++) {
        data <<= 1;
        data |= (HWREG(ulRxGPIO) ? 1 : 0);
        HWREG(ulClkGPIO) = 255;
        SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
        HWREG(ulClkGPIO) = 0;
        SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
    }
    return data;
}

void
SPIRead(unsigned long ulOffset, unsigned char ulCount)
{
    //
    // Assert the SSI chip select.
    //
    HWREG(ulFssGPIO) = 0;
    SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay

    unsigned char controlByte;
    controlByte = ((ulOffset & 0x1) << 3) | SPI_READ;
    ulDataTx[0] = controlByte;
    sendSPIByte(ulDataTx[0]);
    ulDataTx[0] = ulOffset & 0xff;
    sendSPIByte(ulDataTx[0]);
    SysCtlDelay((SysCtlClockGet() / 10000)); // 10 khz delay
    unsigned char dataRx[1];
    unsigned int count;
    for(count = 0; count < ulCount; count++) {
        dataRx[0] = getSPIByte();
        ulDataRx[count] = dataRx[0];
    }
    //
    // Deassert the SSI chip select.
    //
    HWREG(ulFssGPIO) = 255;

    UARTSend(ulDataRx, ulCount);
}

这是我第一次使用 Stellaris。我调查了弱下拉输入和其他可能的配置问题,但无济于事。我有其他自定义硬件使用相同的位敲击技术,可以 100% 工作。谁能看到我哪里出错了?

更新:我已经通过输入信号测试了输入引脚并且输入工作正常。但是,我在尝试读取 eeprom 时只收到 0xff。我已经捕获了芯片的输出、数据输出、clk 和 cs,这些似乎都很好。为什么输出没有响应?这真让我抓狂。有人可以帮忙吗??

最新:将 MOSI 直接反馈回 MISO 会导致主要是 0xff,在接收到的数据中偶尔会出现低位。这是在发送所有 0x00 时。这表明某种输入失败。

这个问题可以被认为是自我回答的,尽管可能对其他人有用。由于连接错误,环回失败。哦!一旦我确定环回工作正常,我就开始怀疑它是否与电压有关。被测 eeprom 可能无法在 Stellaris 提供的 3v 电压下运行。我仍然必须确认这一点,但确实显示在开始编写代码之前先检查明显的内容。在这种情况下,一个 3 到 5 伏的电平转换器应该可以解决问题。

4

0 回答 0