uint8_t dap, ckp;
spi_mode_t mode = SPI_MODE_3;
dap = ~mode & 0x01;
ckp = (~mode & 0x02) >> 1;
// SCI0 时钟开启
CGC->PER0 |= CGC_PER0_SCI0EN_Msk;
// 停止通道3
SCI0->ST0 |= _0008_SCI_CH3_STOP_TRG_ON;
// 分频器
SCI0->SPS0 |= (0 << SCI0_SPS0_PRS01_Pos);
//
SCI0->SIR03 = _0004_SCI_SIRMN_FECTMN | _0002_SCI_SIRMN_PECTMN | _0001_SCI_SIRMN_OVCTMN;
// SPI传输空中断
SCI0->SMR03 = _0020_SMRMN_DEFAULT_VALUE | _8000_SCI_CLOCK_SELECT_CK01 | _0000_SCI_CLOCK_MODE_CKS |
_0000_SCI_TRIGGER_SOFTWARE | _0000_SCI_MODE_SPI | _0000_SCI_TRANSFER_END;
// SPI
SCI0->SCR03 = _0004_SCRMN_DEFAULT_VALUE | _C000_SCI_RECEPTION_TRANSMISSION | dap << 13 | ckp << 12 | _0000_SCI_INTSRE_MASK |
_0000_SCI_PARITY_NONE | _0000_SCI_MSB | _0000_SCI_STOP_NONE | _0003_SCI_LENGTH_8;
// 8分频
SCI0->SDR03 = 0<<9;// 分频=(1+x)*2
/* Set output enable */
if ((mode == SPI_MODE_0) || (mode == SPI_MODE_1))
{
SCI0->SO0 &= ~_0800_SCI_CH3_CLOCK_OUTPUT_1;
}
if ((mode == SPI_MODE_2) || (mode == SPI_MODE_3))
{
SCI0->SO0 |= _0800_SCI_CH3_CLOCK_OUTPUT_1;
}
SCI0->SOE0 |= _0008_SCI_CH3_OUTPUT_ENABLE;
SCLKO11_PORT_SETTING();// P10 clk
SDI11_PORT_SETTING(); // P11 SDI
SDO11_PORT_SETTING(); // P12 SDO
// P13
PORT->P13CFG = 0x00; /* P13 default Alternate function */
PORT->PMC1 &= ~(1 << 3); /* P13 digital function */
PORT->PM1 &= ~(1 << 3); /* P13 is used as SCLK11 output */
PORT->POM1 &= ~(1 << 3); /* P13 is normal output mode */
PORT->P1 |= (1 << 3); /* P13 output high level */
SCI0->SO0 |= _0008_SCI_CH3_DATA_OUTPUT_1;
SCI0->SOE0 |= _0008_SCI_CH3_OUTPUT_ENABLE;
SCI0->SS0 |= _0008_SCI_CH3_START_TRG_ON;
SCI0 SPI11 测试模式0 模式1 可以到(48M主频)12M (64M主频)(16M) 模式2 从机接收有问题,错位的。
模式3 性能最好,(48M主频)24M,64M主频 32M SPI速率无法准确接收。
SPI11 要做从机 需要外部使用GPIO作一个CS来同步,要不就会出现波形错位的现象。
实际如果SPI主机频率偏低,没有CS作为同步,就会造波形接收不稳定。容易错位。
从机代码:
程序是检测GPIO来启动SPI,判断是否有有效数据,BFF位为0表示 没有有效数据,继续等待。当有有效数据置位为1.
读取过后会自动清除标志位,然后停止SPI,避免SPI遭到不必要的干扰造成波形采集被触发,从而造成数据错误。
主机代码:
加一个delay(4),实际是为了给从机手动检测GPIO一个时间,如果立即发,从机为手动检测GPIO,会把SPI数据给错过,从而导致数据接收错误。