реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> mega128 + (MMC + mcp2515), Проблемы с инициализацией mcp2515 в параллели с MMC-картой
musa
сообщение Dec 16 2008, 07:54
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 033
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 668



Суть проекта заключается в следующем: по 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 пишутся и читаются файлы - совершенно без проблем.

В чем может быть проблема? Приветствуются любые сумасшедшие идеи - сроки жмут.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 6 2009, 12:45
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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;
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016