hello:
l need to use SPI to read/write sensor chip recently. SPI control show in below.
SO l set SPI TCR Frame Size is 16bits. my SPI init and read function is below.
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????
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.......
Solved! Go to Solution.
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
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
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......
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
Hi
Daniel ,big thank you for rensponse,l have resolve the problem.