Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega128 + (MMC + mcp2515)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
musa
Суть проекта заключается в следующем: по CAN'у приходят данные с других контроллеров в сети, нам необходимо все это анализировать и избранно записывать в файлик на карте. С mmc картой и файловой системой проблем нет, но вот как только на параллель повесили mcp2515 программа начинает виснуть при попытке сброса mcp2515.

Привожу ответственные куски кода:

Код
#define MCP_CS_PORT            PORTB
#define MCP_CS_DDR            DDRB
#define MCP_CS_PIN            4
#define MCP_SELECT()    cbi(MCP_CS_PORT, MCP_CS_PIN)
#define MCP_DESELECT()    sbi(MCP_CS_PORT, MCP_CS_PIN)


Сброс mcp2515:
Виснет в spiSendByte - больше негде.
Код
void reset2515(void)
{
    u08 cnt;
    
#ifdef MCP2515_DEBUG
    rprintf("mcp2515: Resetting...\n");
#endif

    MCP_SELECT();
    spiSendByte(CAN_RESET);
    MCP_DESELECT();

    for (cnt=0;cnt<0xff;cnt++);
}


spiSendByte - из библиотеки avrlib:
(прерывание не используется, код исполняется между #else и #endif)
Код
void spiSendByte(u08 data)
{
    // send a byte over SPI and ignore reply
    #ifdef SPI_USEINT
        while(!spiTransferComplete);
        spiTransferComplete = FALSE;
    #else
        while(!(inb(SPSR) & (1<<SPIF)));
    #endif

    outb(SPDR, data);
}


По осциллографу клок идет, чип селект дергается, по линиям данных я вообще ничего не вижу.
SPI точно работает, на MMC пишутся и читаются файлы - совершенно без проблем.

В чем может быть проблема? Приветствуются любые сумасшедшие идеи - сроки жмут.
defunct
Цитата(musa @ Dec 16 2008, 09:54) *
Сброс mcp2515:
Виснет в spiSendByte - больше негде.
чем может быть проблема?

У Вас небезопастный код этого spiSendByte.
SPIF можно потерять, если SPDR/SPSR читаются в другом месте.


Цитата
Приветствуются любые сумасшедшие идеи - сроки жмут.

Попробуйте адаптировать Ваш код под безопасную функцию:
Код
U8 spiTransfer( U8 sdata)
{
    // send a byte over SPI
    SPDR = sdata;

    // wait until SPI transfer completes
    while( !(SPSR & (1<<SPIF)) );

    // read and return a reply byte (accessing SPDR shall automatically clear the SPIF flag)
    return SPDR;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.