1: int32_t AG903_SSPMgrSetSpiMode(
AG903_SSPMgrHandle* handle,
AG903_SSPMgrSpiParam* param)
2: {
3:
AG903_SSPPrmCtrl ctrl = {0};
4:
AG903_SSPPrmCtrl2 ctrl2;
5: int32_t retval =
AG903_ENONE;
6: _Bool idle;
7: uint8_t ch;
8:
9: retval = SSPMgr_CheckHandle(handle, &ch);
10:
if(
AG903_ENONE != retval) {
11:
return -
AG903_EINVAL;
12: }
13:
if(NULL == param) {
14:
return -
AG903_EINVAL;
15: }
16:
if( (
AG903_SSP_SDL_MAX < param->wordlen) ||
17: (
AG903_SSP_SPIDIV_MIN > param->clkdiv) ||
18: (0x01 & param->clkdiv) ||
19: (AG903_SSP_POL_TYPENUM <= param->polarity) ||
20: (AG903_SSP_FIRSTBIT_TYPENUM <= param->firstbit) ||
21: (AG903_SSP_SPICLK_MODENUM <= param->sclktype) ){
22:
return -
AG903_EINVAL;
23: }
24: idle = SSPMgr_CheckIdle(ch);
25:
if(
true != idle) {
26:
return -
AG903_EBUSY;
27: }
28:
29: ctrl.format = AG903_SSP_FORMAT_SPI;
30:
if (param->flash) {
31: ctrl.spi_flash = 1;
32: }
33:
if(AG903_SSP_FIRSTBIT_LSB == param->firstbit) {
34: ctrl.lsb = 1;
35: }
36:
if(AG903_SSP_POL_NEGATIVE == param->polarity) {
37: ctrl.spi_fspo = 0;
38: }
39:
if(
true == param->slave) {
40: ctrl.opm = AG903_SSP_OPM_SLAVE;
41: }
42:
else {
43: ctrl.opm = AG903_SSP_OPM_MASTER;
44: }
45:
switch(param->sclktype) {
46:
case AG903_SSP_SPICLK_MODE0:
47: ctrl.sclkpo = 0;
48: ctrl.sclkph = 0;
49:
break;
50:
case AG903_SSP_SPICLK_MODE1:
51: ctrl.sclkpo = 0;
52: ctrl.sclkph = 1;
53:
break;
54:
case AG903_SSP_SPICLK_MODE2:
55: ctrl.sclkpo = 1;
56: ctrl.sclkph = 0;
57:
break;
58:
case AG903_SSP_SPICLK_MODE3:
59: ctrl.sclkpo = 1;
60: ctrl.sclkph = 1;
61:
break;
62:
default:
63:
64:
break;
65: }
66: ctrl.sdl = param->wordlen-1;
67: ctrl.sclk_div = (param->clkdiv>>1)-1;
68:
69:
AG903_SSPPrmSetControl(ch, &ctrl);
70:
71:
AG903_SSPPrmGetControl2(ch, &ctrl2);
72: ctrl2.fsos = 0;
73: ctrl2.fs = (AG903_SSP_POL_NEGATIVE==param->polarity) ? 1 : 0;
74:
AG903_SSPPrmSetControl2(ch, &ctrl2);
75:
76: SspChStat[ch].format = AG903_SSP_FORMAT_SPI;
77: SspChStat[ch].wordlen = param->wordlen;
78: SspChStat[ch].slave = param->slave;
79: SspChStat[ch].tx_thod =
AG903_SSP_TXFIFO_THRESHOLD;
80: SspChStat[ch].rx_thod =
AG903_SSP_RXFIFO_THRESHOLD;
81:
82: SspSpiParam[ch] = *param;
83:
84:
return retval;
85: }