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