0

我目前正在实现一个用于与 ATMEGA32 MCU 一起使用的 WINC1500 驱动程序,它卡在“while(!spi_is_tx_empty(WINC1500_SPI));”这一行上。代码构建并运行,但它不会清除此函数中的内容以继续执行我的代码并启动 Wifi 模块。我已经被这个问题困扰了好几个星期了,没有任何进展,也不知道如何解决它。

static inline bool spi_is_tx_empty(volatile avr32_spi_t *spi)
{
    // 1 = All Transmissions complete
    // 0 = Transmissions not complete 
    return (spi->sr & AVR32_SPI_SR_TXEMPTY_MASK) != 0;
}

这是我对 SPI Tx/Rx 功能的实现

void m2mStub_SpiTxRx(uint8_t *p_txBuf,
uint16_t txLen,
uint8_t *p_rxBuf,
uint16_t rxLen)

{
uint16_t byteCount;
uint16_t i;

uint16_t data;

// Calculate the number of clock cycles necessary, this implies a full-duplex SPI.
byteCount = (txLen >= rxLen) ? txLen : rxLen;

// Read / Transmit.
for (i = 0; i < byteCount; ++i)
{
    // Wait for transmitter to be ready.
    while(!spi_is_tx_ready(WINC1500_SPI));

    // Transmit.
    if (txLen > 0)
    {
        // Send data from the transmit buffer
        spi_put(WINC1500_SPI, *p_txBuf++);
        --txLen;
    }
    else
    {
        // No more Tx data to send, just send something to keep clock active.
        // Here we clock out a don't care byte 
        spi_put(WINC1500_SPI, 0x00U);

        // Not reading it back, not being cleared 16/1/2020
    }

    // Reference http://asf.atmel.com/docs/latest/avr32.components.memory.sdmmc.spi.example.evk1101/html/avr32_drivers_spi_quick_start.html
    // Wait for transfer to finish, stuck on here
    // Need to clear the buffer for it to be able to continue 
    while(!spi_is_tx_empty(WINC1500_SPI));

    // Wait for transmitter to be ready again
    while(!spi_is_tx_ready(WINC1500_SPI));

    // Send dummy data to slave, so we can read something from it.
    spi_put(WINC1500_SPI, 0x00U);    // Change dummy data from 00U to 0xFF idea

    // Wait for a complete transmission
    while(!spi_is_tx_empty(WINC1500_SPI));

    // Read or throw away data from the slave as required.
    if (rxLen > 0)
    {
        *p_rxBuf++ = spi_get(WINC1500_SPI);
        --rxLen;
    }
    else
    {
        spi_get(WINC1500_SPI);
    }
}

调试输出日志

Disable SPI
Init SPI module as master
Configure SPI and Clock settings
spi_enable(WINC1500_SPI)
InitStateMachine()
INIT_START_STATE
InitStateMachine()
INIT_WAIT_FOR_CHIP_RESET_STATE
m2mStub_PinSet_CE
m2mStub_PinSet_RESET
m2mStub_GetOneMsTimer();
SetChipHardwareResetState (CHIP_HARDWARE_RESET_FIRST_DELAY_1MS)
InitStateMachine()
INIT_WAIT_FOR_CHIP_RESET_STATE
if(m2m_get_elapsed_time(startTime) >= 2)
m2mStub_PinSet_CE(M2M_WIFI_PIN_HIGH)
startTime = m2mStub_GetOneMsTimer();
SetChipHardwareResetState(CHIP_HARDWARE_RESET_SECOND_DELAY_5_MS);
InitStateMachine()
INIT_WAIT_FOR_CHIP_RESET_STATE
m2m_get_elapsed_time(startTime) >= 6
m2mStub_PinSet_RESET(M2M_WIFI_PIN_HIGH)
startTime = m2mStub_GetOneMsTimer();
SetChipHardwareResetState(CHIP_HARDWARE_RESET_FINAL_DELAY);
InitStateMachine()
INIT_WAIT_FOR_CHIP_RESET_STATE
m2m_get_elapsed_time(startTime) >= 10
SetChipHardwareResetState(CHIP_HARDWARE_RESET_COMPLETE)
retVal =  true // State machine has completed successfully
g_scanInProgress = false
nm_spi_init();
reg = spi_read_reg(NMI_SPI_PROTOCOL_CONFIG)
Wait for a complete transmission
Wait for transmitter to be ready
SPI_PUT(WINC1500_SPI, *p_txBuf++);
--txLen;
Wait for transfer to finish, stuck on here
Wait for transfer to finish, stuck on here
4

1 回答 1

0

ATmega32 是一个 8 位 AVR,但您似乎正在使用 AVR32 的代码,这是一个 32 位 AVR 系列。您可能只是使用了完全错误的代码,您应该查阅 ATmega32 的数据表,并搜索 AVR ATmega 系列的 SPI。

于 2020-02-06T17:23:56.677 回答