首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“while(!spi_is_tx_empty(WINC1500_SPI));”

在“while(!spi_is_tx_empty(WINC1500_SPI));”
EN

Stack Overflow用户
提问于 2020-02-06 21:35:01
回答 1查看 52关注 0票数 0

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

代码语言:javascript
复制
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函数的实现

代码语言:javascript
复制
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);
    }
}

调试输出日志

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-02-07 01:23:57

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60096227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档