In the master mode, the clock provided to the SPI module is the instruction cycle TCY . This clock will then be prescaled by the primary prescaler, specified by PPRE<1:0> (SPIxCON<1:0>), and the secondary prescaler, specified by SPRE<2:0> (SPIxCON<4:2>). The prescaled instruction clock becomes the serial clock and is provided to external devices via the SCKx pin.
Attention!!! Note that the SCKx signal clock is not free running for normal SPI modes (8-bit or 16-bit). It will only run for 8 or 16 pulses when the SPIxBUF is loaded with data. It will however, be continuous for framed modes.
The SCKx clock frequency as a function of the primary and secondary prescaler settings is calculated by the following equationFCY = 30 MHZ | SECONDARY PRESCALER SETTINGS | |||||
---|---|---|---|---|---|---|
1:1 | 2:1 | 4:1 | 6:1 | 8:1 | ||
Primary prescaler settings | ||||||
1:1 | 30 000 | 15 000 | 7 500 | 5 000 | 3 750 | |
4:1 | 7 500 | 3 750 | 1 875 | 1 250 | 938 | |
16:1 | 1 875 | 938 | 469 | 313 | 234 | |
64:1 | 469 | 234 | 117 | 78 | 59 | |
Fcy = 5 Mhz | ||||||
Primary prescaler settings | ||||||
1:1 | 5 000 | 2 500 | 1 250 | 833 | 625 | |
4:1 | 1 250 | 625 | 313 | 208 | 156 | |
16:1 | 313 | 156 | 78 | 52 | 39 | |
64:1 | 78 | 39 | 20 | 13 | 10 |
NOTE: SCKx clock frequencies shown in kHz. All frequencies are not supported; electrical characteristics of individual microcontrollers of dsPIC30F family should be consulted.
program SPITest const CS_PIN = 0 ' DAC CS pin dim value as word sub procedure InitMain() TRISF.CS_PIN = 0 ' CS pin LATF.CS_PIN = 1 ' Set CS to inactive Spi1_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, _SPI_PRESCALE_SEC_1, _SPI_PRESCALE_PRI_1, _SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_ACTIVE_2_IDLE) ' Init SPI end sub ' DAC increments (0..4095) --> output voltage (0..Vref) sub procedure DAC_Output(dim valueDAC as word) while (SPI1STAT.1 = 1) ' wait for SPI module to finish, if doing something nop wend LATF.CS_PIN = 0 ' CS enable for DAC SPI1BUF = 0x3000 or valueDAC ' Write CurrentValue to DAC (0x3 is required by DAC) while (SPI1STAT.1 = 1) ' Wait for SPI module to finish write nop wend LATF.CS_PIN = 1 ' CS disable for DAC end sub main: InitMain() while true value = 1 while value < \$FFF DAC_Output(value) Delay_ms(5) value = value+1 wend wend end.Procedure Spi2_Init initializes the SPI module in master mode 8-bit formatted, without the SS2 pin, sampling in the middle of the SPI cycle, prescale 1:8, and the clock FCY:1 low while waiting. If another format or communication speed is desired, the procedure Spi2_Init_Advanced instead of Spi2_Init should be used. The procedure Spi2_Data_Ready reads the value of the status bit SPIRBF (SPI2STAT<0>) and checks if there are data loaded into the receive buffer register. The procedure Spi2_Write transmits data via the SPI module. Data reception is performed by the procedure Spi2_Read. The SPI moduled is disabled by the procedure Spi2_Stop (clearing the control bit SPIEN), and the SPI module enable (setting the control bit SPIEN) is performed automatically by the procedure Spi2_Init or Spi2_Init_Advanced.