使用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;
}