예제 #1
0
파일: scp1000.c 프로젝트: smooker/ebrequad
/*******************************************************************************
**                                                                            **
** FUNC-NAME     : SCP_Init()                                                 **
**                                                                            **
*******************************************************************************/
void SCP_Init(void)
{
    /* Init SPI peripheral */
    pinMode(SCK_PIN, OUTPUT);
    pinMode(MOSI_PIN, OUTPUT);
    pinMode(MISO_PIN, INPUT);
    pinMode(SS_PIN, OUTPUT);
    SPI_SetMode(_BV(SPIE) | _BV(SPR1)); /* enable SPI ISR, Fosc/16 (250kHz) */

    /* Attach external interrupt to the DRDY pin, SCP1000 data ready. MEGA pin 19 */
    attachInterrupt(EXTERNAL_INT_4, Scp_DataReadyISR, RISING);
}
예제 #2
0
static rt_err_t configure(struct rt_spi_device *device,
                          struct rt_spi_configuration *configuration)
{
    struct rt_spi_bus *spi_bus = (struct rt_spi_bus *)device->bus;
    struct tina_spi_cs *tina_spi_cs = device->parent.user_data;
    struct tina_spi *_spi_info = (struct tina_spi *)spi_bus->parent.user_data;
    SPI_T *spi = _spi_info->spi;

    DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

    RT_ASSERT(device != RT_NULL);
    RT_ASSERT(configuration != RT_NULL);

    DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

    DEBUG_PRINTF("spi address: %08X\n", (rt_uint32_t)spi);

    SPI_Disable(spi);
    SPI_Reset(spi);
    SPI_ResetRxFifo(spi);
    SPI_ResetTxFifo(spi);

    DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

    /* data_width */
    if (configuration->data_width != 8)
    {
        DEBUG_PRINTF("error: data_width is %d\n", configuration->data_width);
        return RT_EIO;
    }

    DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);
    SPI_SetDuplex(spi, SPI_TCTRL_DHB_FULL_DUPLEX);
    SPI_SetMode(spi, SPI_CTRL_MODE_MASTER);

    /* MSB or LSB */
    if (configuration->mode & RT_SPI_MSB)
    {
        SPI_SetFirstTransmitBit(spi, SPI_TCTRL_FBS_MSB);
    }
    else
    {
        SPI_SetFirstTransmitBit(spi, SPI_TCTRL_FBS_LSB);
    }

    switch (configuration->mode)
    {
    case RT_SPI_MODE_0:
        SPI_SetSclkMode(spi, SPI_SCLK_Mode0);
        break;
    case RT_SPI_MODE_1:
        SPI_SetSclkMode(spi, SPI_SCLK_Mode1);
        break;
    case RT_SPI_MODE_2:
        SPI_SetSclkMode(spi, SPI_SCLK_Mode2);
        break;
    case RT_SPI_MODE_3:
        SPI_SetSclkMode(spi, SPI_SCLK_Mode3);
        break;
    }

    /* baudrate */
    {
        unsigned int spi_clock = 0;
        rt_uint32_t max_hz;
        rt_uint32_t div;

        DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

        max_hz = configuration->max_hz;

        if (max_hz > SPI_BUS_MAX_CLK)
        {
            max_hz = SPI_BUS_MAX_CLK;
        }
        spi_clock = ahb_get_clk();

        DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

        div = (spi_clock + max_hz - 1) / max_hz;

        dbg_log(DBG_LOG, "configuration->max_hz: %d\n", configuration->max_hz);
        dbg_log(DBG_LOG, "max freq: %d\n", max_hz);
        dbg_log(DBG_LOG, "spi_clock: %d\n", spi_clock);
        dbg_log(DBG_LOG, "div: %d\n", div);

        SPI_SetClkDiv(spi, div / 2);
    } /* baudrate */

    SPI_ManualChipSelect(spi, tina_spi_cs->cs);
    SPI_SetDataSize(spi, 0, 0);
    SPI_Enable(spi);

    DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__);

    return RT_EOK;
};