Такая вот проблемка. Есть железный SPI0 на AT91SAM7X. По этому интерфейу подключено два устройства, каждое устройство обслуживается своей задачей. Написал вот такой код для обращения к SPI:
Код
SPI_RESULT SPI_Xfer(SPI_XDesc_t *desc)
{
/* Check valid device number */
if(g_DevCnt <= desc->dev_idx)
return SPI_RES_INVALID_DEVICE_INDEX;
/* Get desc & interface */
SPI_CS_DESC *cs = &g_SPI_CS[desc->dev_idx];
AT91PS_SPI spi = cs->spi;
/* Wait for SPI unlocked */
UINT8 os_err;
OSFlagPend(g_SPI_Events, cs->locked,
OS_FLAG_WAIT_SET_ANY | OS_FLAG_CONSUME, SPI_XFER_TIMEOUT, &os_err);
/* Interface is locked. Select device */
................................................................................
.........................
/* Unlock interface & return OK */
OSFlagPost(g_SPI_Events, cs->locked, OS_FLAG_SET, &os_err);
return SPI_RES_OK;
}
{
/* Check valid device number */
if(g_DevCnt <= desc->dev_idx)
return SPI_RES_INVALID_DEVICE_INDEX;
/* Get desc & interface */
SPI_CS_DESC *cs = &g_SPI_CS[desc->dev_idx];
AT91PS_SPI spi = cs->spi;
/* Wait for SPI unlocked */
UINT8 os_err;
OSFlagPend(g_SPI_Events, cs->locked,
OS_FLAG_WAIT_SET_ANY | OS_FLAG_CONSUME, SPI_XFER_TIMEOUT, &os_err);
/* Interface is locked. Select device */
................................................................................
.........................
/* Unlock interface & return OK */
OSFlagPost(g_SPI_Events, cs->locked, OS_FLAG_SET, &os_err);
return SPI_RES_OK;
}
Поясню идею. Создан флаг блокировки интерфейса. Когда он установлен - интерфейс не блокирован, но при выходе из функции OSFlagPend он автоматически обнуляется, тем самым блокируя интерфейс для всех остальных задач. При выходе из функции передачи SPI_Xfer(...) флаг блокировки опять устанавливется, тем самым разрешая другой задаче работать с интерфейсом...
Вот только что-то не совсем все это работает. Кто знает, поясните, где я ошибаюсь.