我正在使用 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 伏的电平转换器应该可以解决问题。