how to use spi read 24bit data on use s32k144

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

how to use spi read 24bit data on use s32k144

Jump to solution
2,564 Views
jinshuaixu
Contributor V

hello:

      l need to use SPI to read/write sensor chip recently. SPI control show in below.

pastedImage_1.png

    SO  l set SPI  TCR Frame Size is 16bits. my  SPI init and read function is below. 

pastedImage_6.png

void LPSPI0_init_master(void) {
PCC->PCCn[PCC_LPSPI0_INDEX] = 0; /* Disable clocks to modify PCS ( default) */
//PCC->PCCn[PCC_LPSPI1_INDEX] = 0xC6000000; /* Enable PCS=SPLL_DIV2 (40 MHz func'l clock) */
PCC->PCCn[PCC_LPSPI0_INDEX] = 0xC1000000; /* Enable PCS=SOSC_DIV2 (16 MHz func'l clock) */
//clock source select 001 select soscdiv2_clk

LPSPI0->CR = 0x00000000; /* Disable module for configuration */
LPSPI0->IER = 0x00000000; /* Interrupts not used */
LPSPI0->DER = 0x00000000; /* DMA not used */
LPSPI0->CFGR0 = 0x00000000; /* Defaults: */
/* RDM0=0: rec'd data to FIFO as normal */
/* CIRFIFO=0; Circular FIFO is disabled */
/* HRSEL, HRPOL, HREN=0: Host request disabled */
LPSPI0->CFGR1 = 0x00000001; /* Configurations: master mode*/
/* PCSCFG=0: PCS[3:2] are enabled */
/* OUTCFG=0: Output data retains last value when CS negated */
/* PINCFG=0: SIN is input, SOUT is output */
/* MATCFG=0: Match disabled */
/* PCSPOL=0: PCS is active low */
/* NOSTALL=0: Stall if Tx FIFO empty or Rx FIFO full */
/* AUTOPCS=0: does not apply for master mode */
/* SAMPLE=0: input data sampled on SCK edge */
/* MASTER=1: Master mode */

LPSPI0->TCR = 0x4800000F;   //16 bits, //PRESCALE=1: Functional clock divided by 2*1 = 2 */16m/2=8M 1/8M=125ns
//LPSPI0->TCR = 0x5100000F; /* Transmit cmd: PCS3, 16 bits, prescale func'l clk by 4, etc*/
/* CPOL=0: SCK inactive state is low */
/* CPHA=1: Change data on SCK lead'g, capture on trail'g edge*/
/* PRESCALE=2: Functional clock divided by 2**2 = 4 */
/* PCS=1: Transfer using PCS3 */
/* LSBF=0: Data is transfered MSB first */
/* BYSW=0: Byte swap disabled */
/* CONT, CONTC=0: Continuous transfer disabled */
/* RXMSK=0: Normal transfer: rx data stored in rx FIFO */
/* TXMSK=0: Normal transfer: data loaded from tx FIFO */
/* WIDTH=0: Single bit transfer */
/* FRAMESZ=15: # bits in frame = 15+1=16 */
LPSPI0->CCR = 0x04090800; // /* SCKDIV=0: SCK divider =0+2 = 2 2*125ns=250ns (0.25 usec: 4 MHz baud rate) */
//LPSPI1->CCR = 0x04090808; /* Clock dividers based on prescaled func'l clk of 100 nsec */
/* SCKPCS=4: SCK to PCS delay = 4+1 = 5 (500 nsec) */
/* PCSSCK=4: PCS to SCK delay = 9+1 = 10 (1 usec) */
/* DBT=8: Delay between Transfers = 8+2 = 10 (1 usec) */
/* SCKDIV=8: SCK divider =8+2 = 10 (1 usec: 1 MHz baud rate) */
LPSPI0->FCR = 0x00000003; /* RXWATER=0: Rx flags set when Rx FIFO >0 */
/* TXWATER=3: Tx flags set when Tx FIFO <= 3 */
LPSPI0->CR = 0x00000009; /* Enable module for operation */
/* DBGEN=1: module enabled in debug mode */
/* DOZEN=0: module enabled in Doze mode */
/* RST=0: Master logic not reset */
/* MEN=1: Module is enabled */
}

void LPSPI0_Register_Read_TDC1000(uint8_t *TDC1000_commond,uint16_t *TDC1000_Read_data,uint8_t TDC1000_byte) {
uint8_t temp1;
uint16_t TDC1000_write_Buf[10];

for (temp1 = 0; temp1 < TDC1000_byte; temp1++) {
TDC1000_write_Buf[temp1] = 0xff + (TDC1000_commond[temp1] &(~0x40))*256;

SELECT_PCS0();//pcs select
//while((LPSPI0->SR & 0x01000000)>>24==1);//busy wait
LPSPI0_transmit_16bits(TDC1000_write_Buf[temp1]);//send command and data
while((LPSPI0->SR & LPSPI_SR_TCF_MASK)>>LPSPI_SR_TCF_SHIFT==0);//wait until send success
LPSPI0->SR |= LPSPI_SR_TCF_MASK;//All transfers have completed flag
TDC1000_Read_data[temp1]=LPSPI0_receive_16bits();
TDC1000_Read_data[temp1]=TDC1000_Read_data[temp1]&0xff;
}
}

now  l want read 8bits data sometime, read 24bits sometime,how l set read function. set as below????

pastedImage_1.png

void LPSPI0_Register_Read_TDC1000(uint8_t *TDC1000_commond,uint16_t *TDC1000_Read_data,uint8_t TDC1000_byte) {
uint8_t temp1;
uint16_t TDC1000_write_Buf[10];

for (temp1 = 0; temp1 < TDC1000_byte; temp1++) {
TDC1000_write_Buf[temp1] = 0xff + (TDC1000_commond[temp1] &(~0x40))*256;

SELECT_PCS0();//pcs select
LPSPI0_transmit_16bits(TDC1000_write_Buf[temp1]);//send command and data
while((LPSPI0->SR & LPSPI_SR_TCF_MASK)>>LPSPI_SR_TCF_SHIFT==0);//wait until send success
LPSPI0->SR |= LPSPI_SR_TCF_MASK;//All transfers have completed flag
TDC1000_Read_data[temp1]=LPSPI0_receive_16bits();
TDC1000_Read_data[temp1]=TDC1000_Read_data[temp1]&0xff;

TDC1000_Read1_data[temp1]=LPSPI0_receive_16bits();
TDC1000_Read1_data[temp1]=TDC1000_Read1_data[temp1]&0xff;
}
}

who can help me ?

thank you.......

0 Kudos
1 Solution
2,165 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi,

The command can be changed as needed in run time.

It does not have to be set in the init function.

Please read the description of the TCR register in the RM rev.9

Section 49.3.1.15 Transmit Command Register (TCR).

Thanks,

Daniel

View solution in original post

0 Kudos
4 Replies
2,165 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hello,

It depends on the slave specification, however, in general, you will need to send a 24-bit frame to get the data from the slave. To do this, change the SPI command by a 32-bit write to the TCR register, FRAMESZ = 23, and send the frame.

Regards,

Daniel

0 Kudos
2,165 Views
jinshuaixu
Contributor V

Hi

    sometimes,I need read 8 bits data,sometimes l need read 24 bits data,in SPI init functin void LPSPI0_init_master(void),how I  to set  TCR register  FRAMESZ ? it should be setted 15 or 31? or when  this time read 8bits data,I reinit void LPSPI0_init_master(void)TCR register  FRAMESZ is 15,when  next time read 24bits data,I reinit void LPSPI0_init_master(void)TCR register  FRAMESZ is 31?

      the chip register  l use is below......

pastedImage_1.png

0 Kudos
2,166 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi,

The command can be changed as needed in run time.

It does not have to be set in the init function.

Please read the description of the TCR register in the RM rev.9

Section 49.3.1.15 Transmit Command Register (TCR).

Thanks,

Daniel

0 Kudos
2,165 Views
jinshuaixu
Contributor V

Hi

    Daniel ,big thank you for rensponse,l have resolve the problem.

0 Kudos