我正在使用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伏电平转换器应该对问题进行排序。