在两个控制器之间同步

时间:2018-12-17 13:48:10

标签: embedded

使用2个MM9z_639控制器作为SPI主设备和SPI从设备。

在数据表中提到当它配置为主时钟时,时钟应为总线时钟/ 2,当它配置为从时钟时,时钟应为总线时钟/ 4

因此,我决定保留总线时钟/ 4,以确保两个控制器都在同一时间运行。我使用的总线时钟为28Mhz。

最初,主会发送字符'R'。从属会回复'R'。然后两个都将开始执行他们的代码。

为验证同步,我启用了500ms计时器。每500ms音调计数器将在两侧递增。

主机每隔一秒钟就会询问从机的计数器值,并存储其计数值。如果两个计数器都相同,则它们是同步的。

但是问题是:

在主= 2,4,6,8,...

从奴隶= 0,0,2,4

最初两个字节为0。

然后,我决定在遇到中断时将一些伪数据从从机发送到主机。在这种情况下,我将获得适当的价值。

我还检查了两者是否以相同的速度运行。

请找到SPI的代码。 我正在使用控制器 MM9Z1_639 NXP

此处正在两个控制器之间进行同步,以便两个控制器应同时开始读取adc通道。首先,我从主机向从机发送char'a',从机将以'r'重播,然后在病房中,这两个代码都将开始读取adc通道。 并行启动500ms定时器以增加计数。并且每隔1秒钟读取一次主从计数。

void Init(void)
{


    /* SPICR1 register configuration */
    SPICR1_SPE = 1U;
    SPICR1_LSBFE = 0U;
    SPICR1_CPHA = 1U;
    SPICR1_CPOL = 0U;


#ifdef MICRO1
    SPICR1_MSTR = 1U;

    SPICR1_SSOE = 0U;
    SPICR1_SPIE = 0U;
    SPICR1_SPTIE = 0U;
#endif

#ifdef MICRO2
    SPICR1_MSTR = 0U;
    SPICR1_SSOE = 0U;
    SPICR1_SPIE = 1U;
    SPICR1_SPTIE = 1U;  
#endif

    /*SPICR2 register configuration */

    SPICR2_XFRW = 0U; /* 8 bit data transfer */
    SPICR2_SPC0 = 0U;
    SPICR2_BIDIROE = 0U;


#ifdef MICRO1
    SPICR2_MODFEN = 0U;

    SPICR2_SPISWAI = 1U;
#endif

#ifdef MICRO1
    SPICR2_MODFEN = 0U;
#endif

    /*SPIBR configuration */
    SPIBR = 0x01;

T_UBYTE Spi_ASample_Tx_Buf_Index = 0;
T_FLAG Spi_ASample_Sync_data;
T_UBYTE Rx_Count = 0;
static T_UBYTE counter =0x03;
static T_UBYTE call =0x00;
static T_UBYTE status_timer =0;

void ISR_FCT Spi_ASample_ISR(void)
{


#ifdef MICRO2
    if (SPISR_SPTEF)
    {
        (void)bspi_GetRxData();
        if(status_timer==1)
        {
        SPIDRL='r';
        status_timer=3;



        }
        else if(status_timer==0)
        {
            SPIDRL='A';
        }
        else
        {
            SPIDRL=ADC_sync_time();

        }
        if (Rx_Count < 7)
            Rx_Count++;
        else
            Rx_Count = 0;
    }
#endif

}


void start_ADC_Sync_time()
{
    if(status_timer>0)
    {
    call=(call+1);
    }
}

T_UBYTE ADC_sync_time(void)
{

return call;
}


void set_flag(void)
{
    status_timer=1;
}

0 个答案:

没有答案