SPI00 做从机启动SS00
// 修改发现有的 功能可以随意映射,有的功能是固定的。
#define SPI_START() SCI0->SS0 |= _0001_SCI_CH0_STOP_TRG_ON
#define SPI_STOP() SCI0->ST0 |= _0001_SCI_CH0_STOP_TRG_ON
// bref: spi11 初始化 从机
// para:
// note:
static void spi00_init(void)
{
uint8_t dap, ckp;
spi_mode_t mode = SPI_MODE_0;
dap = ~mode & 0x01;
ckp = (~mode & 0x02) >> 1;
// SCI0 时钟开启
CGC->PER0 |= CGC_PER0_SCI0EN_Msk;
// 停止通道0
SCI0->ST0 |= _0000_SCI_CH3_STOP_TRG_OFF;
// 分频器
SCI0->SPS0 |= (0 << SCI0_SPS0_PRS01_Pos);
//
SCI0->SIR00 = _0004_SCI_SIRMN_FECTMN | _0002_SCI_SIRMN_PECTMN | _0001_SCI_SIRMN_OVCTMN;
// SPI传输空中断
SCI0->SMR00 = _0020_SMRMN_DEFAULT_VALUE | _8000_SCI_CLOCK_SELECT_CK01 | _4000_SCI_CLOCK_MODE_TI0N |
_0000_SCI_TRIGGER_SOFTWARE | _0000_SCI_MODE_SPI | _0000_SCI_TRANSFER_END;
// SPI
SCI0->SCR00 = _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->SDR00 = 0;
/* 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 |= _0001_SCI_CH0_OUTPUT_ENABLE;
MISC->ISC = 0x80;
// SPI00 时钟映射到P10 0x03代表映射到P10 数据手册25页
PORT->SCKI00PCFG = 0x03; /* P10 default Alternate function */
// 数据模式
PORT->PMC1 &= ~(1 << 0); /* P10 digital function */
// 输入
PORT->PM1 |= (1 << 0); /* P10 is used as SCLK11 input */
// P11 作为SDI00
PORT->SDI00PCFG = 0x04;
// 数字模式
PORT->PMC1 &= ~(1 << 1);
// 输入
PORT->PM1 |= (1 << 1);
// P12 作为SDO00
PORT->P12CFG = 0x05;
// 数字模式
PORT->PMC1 &= ~(1 << 2);
// 输出
PORT->PM1 &= ~(1 << 2);
// P13--SS00
PORT->SS00PCFG = 0x06; /* P13 default Alternate function */
// 数字模式
PORT->PMC1 &= ~(1 << 3); /* P13 digital function */
// 输入
PORT->PM1 |= (1 << 3); /* P13 is used as SS11 input */
PORT->PU1 |= (1<<3); // P13 上拉电阻
SCI0->SO0 |= _0000_SCI_CH0_DATA_OUTPUT_0;
// SCI0->SS0 |= _0008_SCI_CH3_START_TRG_ON;
// 置位为1 才是清除标志位
SCI0->SIR00 |= 0x07;
SPI_START();
}
MISC->ISC = 0x80;为启动 SS0检测。
输入的复用功能,可以映射到一些端口上。
输出端口。
测试模式0 数据错位。如果先启动从机后启动主机,数据容易错位,如果先启动主机后启动从机,数据正常。
测试在运行过程中,复位启动主从两个其中任意一个,都会造成数据错位。