Stellaris lm3s8962 GPIO输入失败

时间:2013-08-05 16:55:31

标签: ssi gpio

我正在使用bit banging控制SSI上的引脚,用于可切换的微线/ 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时。这表明某种输入失败。

这个问题可以被认为是自我回答,虽然可能对其他人有用。由于连接错误,环回失败。 DOH!一旦我确定环回工作,我就开始怀疑它是否与电压有关。被测试的eeprom可能无法在Stellaris提供的3v级别下运行。我仍然必须确认这一点,但确实先显示在转入代码之前先检查一下。在这种情况下,3至5伏电平转换器应该对问题进行排序。

0 个答案:

没有答案