I use  MC9S12XE256  ,but why" SPI1SR_SPTEF" is always "1",when complete transmiting,i place data into the transmit data register,but " SPI1SR_SPTEF" do't clean?

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

I use  MC9S12XE256  ,but why" SPI1SR_SPTEF" is always "1",when complete transmiting,i place data into the transmit data register,but " SPI1SR_SPTEF" do't clean?

629件の閲覧回数
blin
Contributor I

my code:

void SPI1_Init(void)

  {

   //uint8_t temp;

   SPI1CR1=0x04;

   (void)SPI1SR;

   (void)SPI1DR;

   /*SPPR2~SPPR0=011=3,SPR2~SPR0=010=2 ,最终波特率为 Fbus /(3+1)*(2^(2+1)),假设总线频率为32M。那么算下来SCLK=1M */

   SPI1BR=0x32;

   

   SPI1CR2=0x40;  /*D7=0 D6=XFRW=1数据传输16位,=0是8位 D5=0 D4=MODFEN=0*/

   

    /*SPIE=0 禁止中断,SPE=1 使能SPI模块,SPTIE=0 发送中断禁止,MSTR=1主机工作模式,CPOL=1 SCLK空闲为高电平,CPHA=1 时钟第二个沿采集数据,SSOE=0 片选脚不用,LSBFE=0 MSB先传*/

   SPI1CR1=0x5e;

   

  }

 

 

uint8_t SPI1_Send_Data(uint16_t Send_Data)

{

  uint16_t i;

 

  while(!(SPI1SR_SPTEF));/*wait empty,then load new data*/

  SPI1DR= Send_Data;

 

 

      return 0;

}

ラベル(1)
0 件の賞賛
1 返信

331件の閲覧回数
iggi
NXP Employee
NXP Employee

Hello,

You must clear the SPIF after a write to SPIDR.

The SPI transmitter empty flag SPTEF in the SPISR register indicates when the SPI data register is ready to accept new data. Received data in the SPIDR is valid when SPIF is set.

This is the sequence:

1. Read of SPISR with SPTEF = 1

2. Write to SPIDR (this puts data into the transmit data register)

3. When a transfer is complete and SPIF is cleared, received data is moved into the receive data register.

The data register acts as the SPI receive data register for reads and as the SPI transmit data register for writes.

Also see Table 21-10. SPTEF Interrupt Flag Clearing Sequence in the MC9S12XEP100 reference manual:

http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S12XEP100RMV1.pdf

(You must read SPISR register with SPTEF == 1 and then write to data register SPIDRL)

The code for example:

************************************************************

void main(void) {

  /* put your own code here */

     

  SPI0_Init();                        //SPI0 Init

  for(;;) {

  

  while(!(SPISR_SPTEF));       // Tx buffer empty?

  SPIDR = command;             // All Status Command

  (void)SPISR;                       // clearing SPIF flag

  (void)SPIDR;                       // Dummy read

while(!(SPISR_SPIF));           // wait for transfer done

while(!(SPISR_SPTEF));       //Tx buffer empty?

SPIDR = 0x0000;                 //Dummy value

  (void)SPISR;                     // clearing SPIF flag

  (void)SPIDR;                     // Dummy read

  while(!(SPISR_SPIF));       //wait for data

  result = SPIDR;

   

  } /* loop forever */

  /* please make sure that you never leave main */

}

**************************************************************

Regards,

iggi

0 件の賞賛