Procedure to change use different PCS of SPI0 during runtime?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Procedure to change use different PCS of SPI0 during runtime?

Jump to solution
1,544 Views
michaelkoller
Contributor III

Hey there!

I am trying to use the SPI0 module of my K64F to read sensor data. I can initialize the SPI0 in a way, that I get the reading of only one of the four sensors. That means, I configure the SPI0 at the start of the program to PCS0, 1, 2 or four.

But I cannot change the PCS during runtime. What is the way to do this?

This is my most elaborate try, which also does not work:

while(1){

.

.

.

dspiResult = DSPI_DRV_MasterDeinit(DSPI_MASTER_INSTANCE); //Deinit old PCS


dspiResult = DSPI_DRV_MasterInit(DSPI_MASTER_INSTANCE, //Init new PCS

&masterState,

&masterUserConfig);


dspiResult = DSPI_DRV_MasterConfigureBus(DSPI_MASTER_INSTANCE,

&masterDevice,

&calculatedBaudRate);


dspiResult = DSPI_DRV_MasterTransfer(DSPI_MASTER_INSTANCE,

NULL,

NULL,//sendBuffer,

receiveBuffer,//NULL,

TRANSFER_SIZE);


while (DSPI_DRV_MasterGetTransferStatus(DSPI_MASTER_INSTANCE, &wordsTransfer) == kStatus_DSPI_Busy)

{

}


.

.

.

}


Where is my problem, what am I missing? Please tell me the steps and function calls to do this.

I would be very glad if someone could tell me the correct procedure to do this. I have read the Spi chapter in the manual, but could not find the appropriate pages for that.


Thanks for any help and information!
Cheers,

Michael


Labels (1)
0 Kudos
1 Solution
1,286 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Michael,

I have checked the main.c you have written, I think you misunderstood me, it is unnecessary to call the following function:

while(1)

{

DSPI_DRV_MasterDeinit()

  1. masterState.whichPcs= kDspiPcs1;

DSPI_DRV_MasterInit();

DSPI_DRV_MasterConfigureBus();

DSPI_DRV_MasterTransfer();

while (DSPI_DRV_MasterGetTransferStatus) {}

}

You can use the following code:

while(1)

{

  1. masterState.whichPcs= kDspiPcs1;

DSPI_DRV_MasterTransfer();

while (DSPI_DRV_MasterGetTransferStatus) {}

}

I attach my project which is modified with the project located at:

C:\DriverE\Freescale\KSDK_1.3.0\examples\frdmk64f\driver_examples\dspi\dspi_non_blocking\master\kds

The *.jpeg file is the screenshot from scope, the yellow is SPI0_PCS0(PTD0), the blue is SPI0_PCS1(PTD4), each pin  toggle 64 times, it is correct.

Hope it can help you.

BR

XiangJun Rong

View solution in original post

0 Kudos
4 Replies
1,286 Views
michaelkoller
Contributor III

Hello!

Thank you for that information. I have also tried the method where I only change the pcs in the masterstate without the deinit function. That did not work, as well.

But after comparing my code to yours I noticed that you set the polaritymode separately like this:

DSPI_HAL_SetPcsPolarityMode(g_dspiBase[DSPI_MASTER_INSTANCE],kDspiPcs0,kDspiPcs_ActiveLow);
DSPI_HAL_SetPcsPolarityMode(g_dspiBase[DSPI_MASTER_INSTANCE],kDspiPcs1,kDspiPcs_ActiveLow);

and not only in the

dspi_master_user_config_t SPImasterUserConfigPCS0 = {
   .isChipSelectContinuous = false,
   .isSckContinuous        = false,
   .pcsPolarity            = kDspiPcs_ActiveLow,
   .whichCtar              = kDspiCtar0,
   .whichPcs               = kDspiPcs0

    };

And that was what I was missing the whole time, apparantly.

Now it works fine and I can switch the pcs like you described

Thank you a lot! :smileyhappy:

Best regards,

Michael

0 Kudos
1,286 Views
michaelkoller
Contributor III

Hey, there!

Thanks for the help, but this does not work in my dspi non blocking example. I have attached the main.c file of my dspi non blocking example, maybe you could take a quick look at it and maybe tell me what I'm doing wrong As I said, in my example dspi project I can do pcs1 OR pcs0, but not both in the same run, like your code for example. In my code they only work if I only initialize and use one.

Other people have suggested using the master deinit function, which also didnt work. I have read the manual and the comments in the fsl_dspi_hal, but it does not say anywhere how to correctly change the pcs.

I am already trying for a long time to do this, where is my mistake?

Best regards,

Michael

0 Kudos
1,287 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Michael,

I have checked the main.c you have written, I think you misunderstood me, it is unnecessary to call the following function:

while(1)

{

DSPI_DRV_MasterDeinit()

  1. masterState.whichPcs= kDspiPcs1;

DSPI_DRV_MasterInit();

DSPI_DRV_MasterConfigureBus();

DSPI_DRV_MasterTransfer();

while (DSPI_DRV_MasterGetTransferStatus) {}

}

You can use the following code:

while(1)

{

  1. masterState.whichPcs= kDspiPcs1;

DSPI_DRV_MasterTransfer();

while (DSPI_DRV_MasterGetTransferStatus) {}

}

I attach my project which is modified with the project located at:

C:\DriverE\Freescale\KSDK_1.3.0\examples\frdmk64f\driver_examples\dspi\dspi_non_blocking\master\kds

The *.jpeg file is the screenshot from scope, the yellow is SPI0_PCS0(PTD0), the blue is SPI0_PCS1(PTD4), each pin  toggle 64 times, it is correct.

Hope it can help you.

BR

XiangJun Rong

0 Kudos
1,286 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Michael,

I think you use the SDK1.3 based on FRDM-K64, and use the example:

C:\Freescale\KSDK_1.3.0\examples\frdmk64f\driver_examples\dspi_rongModification\dspi_non_blocking\master\kds

You develop your code based on the example. I think you have to consider two points:

1)finish the pin assignment for SPI0_PCS1, SPI0_PCS2... with the following code:

void PCSInit(void)

{

                    /* SPI0 */

          /* Affects PORTD_PCR0 register, SPI0_PCS0 */

          PORT_HAL_SetMuxMode(PORTD,0u,kPortMuxAlt2);

          /* Affects PORTD_PCR4 register, SPI0_PCS1 */

          PORT_HAL_SetMuxMode(PORTD,4u,kPortMuxAlt2);

          /* Affects PORTD_PCR5 register, PSI0_PCS2 */

          PORT_HAL_SetMuxMode(PORTD,5u,kPortMuxAlt2);

          /* Affects PORTD_PCR6 register, SPI0_PCS3 */

          PORT_HAL_SetMuxMode(PORTD,6u,kPortMuxAlt2);

}

2)secondly, you can use the code to set up different SPI0_PCSx.

masterState.whichPcs= kDspiPcs1;

I attach the code I modified based on the example, I can see the waveform on different SPI0_PCSx, it seems it is okay.

Hope it can help you.

BR

XiangJun Rong

0 Kudos