Kinetis DSPI on PE

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

Kinetis DSPI on PE

跳至解决方案
2,318 次查看
japex92
Contributor I
Hello,

I am writing to know exactly how the DSPI bean works on the PE for the kinetis family (k53 and K60 to be precise). I have

followed a tutorial from freescale (Freescale Technical Information Center) and got the TX working properly; but I still don't get how TX and RX are set independently if the protocol is achieved by shifting the registers involved in the communication. I did activate the events related to SPI  SM1_ReceiveBlock and SM1_SendBlock, but dont know how to syncronize both if I have to receive data while it's transmiting.

I have also tried this on other code:

#define READ_SPI_FLASH_DATA()                 (unsigned char)SPI2_POPR

#define WAIT_SPI_RECEPTION_END()           while (!(SPI2_SR & SPI_SR_RFDF)) {}

#define CLEAR_RECEPTION_FLAG()              SPI2_SR |= SPI_SR_RFDF

#define WRITE_SPI_CMD0_LAST(byte)           SPI2_PUSHR = (byte | SPI_PUSHR_EOQ  | ulChipSelectLine | SPI_PUSHR_CTAS_CTAR0) // write final byte to output FIFO - this will negate the CS line when complete

WRITE_SPI_CMD0(0xff);                                    // write dummy

while( SPI_SR_EOQF != (SPI2_SR & SPI_SR_EOQF));

SPI2_SR = SPI2_SR | SPI_SR_EOQF | SPI_SR_TCF ;

SPI2_MCR |= 0xC01; // halt = 1

WAIT_SPI_RECEPTION_END();                                        // wait until at least one byte is in the receive FIFO

(void)READ_SPI_FLASH_DATA();                                     // discard

CLEAR_RECEPTION_FLAG();                                          // clear the receive flag

Please advise me what to do and how to read the RX buffer when transfering data bytes

0 项奖励
回复
1 解答
1,148 次查看
Petr_H
NXP Employee
NXP Employee

Hello,

Transmitting and receiving is synchronous, as there is only one clock. However, there might be some sync issues beacuse of hardware FIFO. If you'd like to keep synchronized reading and writing, I recommend to do both reading and writing for the whole communication, wait for end of reading and just discard chars that you don't need.

You can find some sample code at the 'Typical usage' pages in the help of  Processor Expert SPIMaster_LDD component. Use the 'Help on component' pop-up menu command of the component in your project or in the Components Library and select 'Typical usage' on the left of the page.

Generally, the basic code without using interrupts looks like this:

  ...

  MySPIPtr = SM1_Init(NULL);                               /* Initialization of SM1 component */

  Error = SM1_ReceiveBlock(MySPIPtr, InpData, BLOCK_SIZE); /* Request data block reception */

  Error = SM1_SendBlock(MySPIPtr, OutData, BLOCK_SIZE);    /* Start transmission/reception */

  while (!SM1_GetBlockReceivedStatus(MySPIPtr)) {          /* Wait until data block is transmitted/received */

    SM1_Main(MySPIPtr);

  }

...

best regards

Petr Hradsky

Processor Expert Support and Servicepacks Team

在原帖中查看解决方案

0 项奖励
回复
2 回复数
1,149 次查看
Petr_H
NXP Employee
NXP Employee

Hello,

Transmitting and receiving is synchronous, as there is only one clock. However, there might be some sync issues beacuse of hardware FIFO. If you'd like to keep synchronized reading and writing, I recommend to do both reading and writing for the whole communication, wait for end of reading and just discard chars that you don't need.

You can find some sample code at the 'Typical usage' pages in the help of  Processor Expert SPIMaster_LDD component. Use the 'Help on component' pop-up menu command of the component in your project or in the Components Library and select 'Typical usage' on the left of the page.

Generally, the basic code without using interrupts looks like this:

  ...

  MySPIPtr = SM1_Init(NULL);                               /* Initialization of SM1 component */

  Error = SM1_ReceiveBlock(MySPIPtr, InpData, BLOCK_SIZE); /* Request data block reception */

  Error = SM1_SendBlock(MySPIPtr, OutData, BLOCK_SIZE);    /* Start transmission/reception */

  while (!SM1_GetBlockReceivedStatus(MySPIPtr)) {          /* Wait until data block is transmitted/received */

    SM1_Main(MySPIPtr);

  }

...

best regards

Petr Hradsky

Processor Expert Support and Servicepacks Team

0 项奖励
回复
1,148 次查看
matheuskotaki
Contributor I

How can I send binary data instead of characters?

0 项奖励
回复