在线时间5 小时
UID2110175
注册时间2014-7-17
NXP金币0
该用户从未签到
注册会员

- 积分
- 87
- 最后登录
- 1970-1-1
|
本帖最后由 FSL_TICS_Robin 于 2014-9-9 11:33 编辑
uint32 spi_init(SPIn_e spin, SPI_PCSn_e pcs, SPI_CFG master,uint32 baud)
{
SPI_MemMapPtr spi_ptr = SPIN[spin];
//使能SPI模块时钟,配置SPI引脚功能
if(spin == SPI0)
{
SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK;
//进行管脚复用
port_init(SPI0_SCK_PIN , ALT2 ); //全部都是 ALT2
if( (SPI0_SOUT_PIN == PTE19) || (SPI0_SOUT_PIN == PTA17) || (SPI0_SOUT_PIN == PTC7) || (SPI0_SOUT_PIN == PTD2) )
{
port_init(SPI0_SOUT_PIN, ALT5 );
}
else
{
port_init(SPI0_SOUT_PIN, ALT2 );
}
if( (SPI0_SIN_PIN == PTE18 ) || (SPI0_SIN_PIN == PTA16 ) || (SPI0_SIN_PIN == PTC6 ) || (SPI0_SIN_PIN == PTD3 ))
{
port_init(SPI0_SIN_PIN , ALT5 | PULLUP );
}
else
{
port_init(SPI0_SIN_PIN , ALT2 );
}
if(pcs & SPI_PCS0) //选择 IO 口 控制 CS
{
(void)GPIO_Init(PORT_D,0,GPO,LVL_H);//gpio_init(SPI0_PCS0_PIN,GPO,1);
//port_init(SPI0_PCS0_PIN, ALT1 );
}
}
else if(spin == SPI1)
{
SIM_SCGC4 |= SIM_SCGC4_SPI1_MASK;
port_init(SPI1_SCK_PIN , ALT2 );
if((SPI1_SOUT_PIN == PTB17) || (SPI1_SOUT_PIN == PTE3) || (SPI1_SOUT_PIN == PTD7) )
{
port_init(SPI1_SOUT_PIN, ALT5 );
}
else
{
port_init(SPI1_SOUT_PIN, ALT2 );
}
if((SPI1_SIN_PIN == PTE1) || (SPI1_SIN_PIN == PTB16) || (SPI1_SIN_PIN == PTD6))
{
port_init(SPI1_SIN_PIN , ALT5 );
}
else
{
port_init(SPI1_SIN_PIN , ALT2 );
}
if(pcs & SPI_PCS0) //选择 IO 口 控制 CS
{
(void)GPIO_Init(PORT_E,4,GPO,LVL_H);
//port_init(SPI1_PCS0_PIN, ALT1 );
}
}
else
{
//传递进来的 spi 模块有误,直接判断断言失败
ASSERT(0);
}
//根据主从机模式设置工作模式。MCU提供最大主机频率是1/2主频,最大从机频率是1/4主频
if(master == MASTER)
{
SPI_C1_REG(spi_ptr) = (0
| SPI_C1_SPE_MASK //使能SPI
| SPI_C1_MSTR_MASK //主机模式
//| SPI_C1_SSOE_MASK //使能自动片选
);
SPI_C2_REG(spi_ptr) = (0
//| SPI_C2_MODFEN_MASK //主机模式故障功能使能
);
return spi_set_baud(spin,baud);
}
else
{
SPI_C1_REG(spi_ptr) = (0
| SPI_C1_SPE_MASK //使能SPI
| SPI_C1_MSTR_MASK //主机模式
//| SPI_C1_SSOE_MASK //使能自动片选
);
SPI_C2_REG(spi_ptr) = (0
| SPI_C2_SPIMODE_MASK
| SPI_C2_MODFEN_MASK //主机模式故障功能使能
);
}
return 0;
}
这是从冷火KL25移植到我KL46上的SPI初始化程序,我打算用SPI来驱动OLED的,但是一直没能实现,大家能帮忙看看这段代码有什么问题吗?
|
|