在线时间0 小时
UID2038410
注册时间2013-9-2
NXP金币0
该用户从未签到
新手上路

- 积分
- 22
- 最后登录
- 1970-1-1
|
我用Cortex-M4 K60驱动彩色TFT液晶的问题,用SPI一帧传送1个字节,我的屏尺寸是1.8(128*160),刷一屏要100ms,可以显示图片。
然后我想用SPI一帧传送2个字节,调试了好久要么是白屏,要么就是黑屏带着彩色的点点,大家讨论下,共同学习。
下面是spi的初始化和发送代码,我用的是SPI2模式:
void DrvSPI_Initial(SPI_MemMapPtr spi, SPI_MODE mode)
{
if(SPI0_BASE_PTR == spi)
{
SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;
PORTC_PCR4 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //PCS0
PORTC_PCR5 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //SCK
PORTC_PCR6 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //SOUT
PORTC_PCR7 = PORT_PCR_MUX(0x2); //SIN
}
else if(SPI1_BASE_PTR == spi)
{
SIM_SCGC6 |= SIM_SCGC6_SPI1_MASK;
PORTE_PCR1 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //SOUT
PORTE_PCR2 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //SCK
PORTE_PCR3 = PORT_PCR_MUX(0x2); //SIN
PORTE_PCR4 = PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; //PCS0
}
else
{
SIM_SCGC3 = SIM_SCGC3_SPI2_MASK; //使能SPI2时钟
PORTB_PCR20 = (PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK); //SPI2_PCS0
PORTB_PCR21 = (PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK); //SPI2_SCK
PORTB_PCR22 = (PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK); //SPI2_SOUT
//PORTB_PCR23 = PORT_PCR_MUX(2); //SPI2_SIN
}
SPI_MCR_REG(spi) |= (SPI_MCR_CLR_TXF_MASK //在传输数据之前先清空TX FIFO
| SPI_MCR_CLR_RXF_MASK //在传输数据之前先清空RX FIFO
| SPI_MCR_PCSIS_MASK //选择信号PCS不活跃状态为高电平
| SPI_MCR_HALT_MASK); //停止SPI数据传输
SPI_MCR_REG(spi) &= ~SPI_MCR_MDIS_MASK; //清除MDIS=0
if(mode == MASTER) //是主模式吗
{
SPI_MCR_REG(spi) |= SPI_MCR_MSTR_MASK; //将SPI设置为主机模式
SPI_CTAR_REG(spi, 0) = (SPI_CTAR_DBR_MASK //Double波特率使能
| SPI_CTAR_BR(0) //波特率Scaler:BR=0,SCALER的值为2
| SPI_CTAR_PBR(0) //PBR=0,波特率分频器的值为2,所以波特率= (f/PBR)*[(1+DBR)/BR]=(50M/2)*((1+1)/2)=25Mbps
| SPI_CTAR_FMSZ(0xf0) //设置数据传输位数为15+1= 16位
| SPI_CTAR_PCSSCK(2) //PCS to SCK Prescaler value is 5,t(csc)=(1/50M)*5*2=0.2ms,拉低PCS信号到开始第一个SCK时钟沿信号的延时
| SPI_CTAR_PASC(2) //t(asc)=(1/50M)*5*2=0.2ms,最后一个SCK时钟沿信号到抬高PCS信号之间的延时
| SPI_CTAR_PDT(2)); //t(dt)=(1/50M)*5*2=0.2ms,用于连续多字节数据帧的传送
SPI_CTAR_REG(spi, 0) &= ~SPI_CTAR_LSBFE_MASK; //传输数据是高位在前,MSB first
//SCK不活跃状态为低电平,数据在SCK时钟的上升沿锁存,下降沿发送
SPI_CTAR_REG(spi, 0) &= ~SPI_CTAR_CPOL_MASK;
SPI_CTAR_REG(spi, 0) &= ~SPI_CTAR_CPHA_MASK;
}
else //是从模式吗
{
SPI_CTAR_SLAVE_REG(spi, 0) = SPI_CTAR_SLAVE_FMSZ(0x07); //设置从机数据传输位数为7+1= 8位
}
SPI_SR_REG(spi) |= ( SPI_SR_EOQF_MASK //SPI数据帧结束标志位清0
| SPI_SR_TFUF_MASK //TX FIFO下溢标志清0
| SPI_SR_TFFF_MASK //TX FIFO满标志清0
| SPI_SR_RFOF_MASK //RX FIFO溢出标志清0
| SPI_SR_RFDF_MASK); //RX FIFO不空标志清0,表示RX FIFO为空,若该位置1表示RX FIFO有有效数据
}
SPI的发送代码:
void DrvSPI_SendOneByte_ActiveCS(SPI_MemMapPtr spi, uint16 buffer)
{
uint8 BufferH, BufferL;
BufferH = (uint8)(buffer >> 8);
BufferL = (uint8)(buffer & 0x00ff);
SPI_SR_REG(spi) = (SPI_SR_EOQF_MASK //在发送数据之前先清除接收最后一帧标志位
| SPI_SR_TFUF_MASK //在发送数据之前先清除TX FIFO下溢标志
| SPI_SR_TFFF_MASK //在发送数据之前先清除TX FIFO充满标志
| SPI_SR_RFOF_MASK //在发送数据之前先清除RX FIFO溢出标志
| SPI_SR_RFDF_MASK); //在发送数据之前先清除RX FIFO不空标志
SPI_MCR_REG(spi) |= (SPI_MCR_CLR_TXF_MASK
| SPI_MCR_CLR_RXF_MASK); //在发送数据之前先清除TX FIFO和RX FIFO
SPI_SR_REG(spi) |= SPI_SR_TCF_MASK; //清除发送完成标志
SPI_PUSHR_REG(spi) = (SPI_PUSHR_CTAS(0) //选择CTAR0寄存器定义传输特性
| SPI_PUSHR_EOQ_MASK //该帧SPI数据是最后一帧数据
| SPI_PUSHR_PCS(1) //片选信号PCS0
| SPI_PUSHR_TXDATA(BufferH)); //写入数据
LCD_SET_DCX;
SPI_PUSHR_REG(spi) = (SPI_PUSHR_CTAS(0) //选择CTAR0寄存器定义传输特性
| SPI_PUSHR_EOQ_MASK //该帧SPI数据是最后一帧数据
| SPI_PUSHR_PCS(1) //片选信号PCS0
| SPI_PUSHR_TXDATA(BufferL)); //写入数据
SPI_MCR_REG(spi) &= ~SPI_MCR_HALT_MASK; //启动SPI数据传输
while((SPI_SR_REG(spi) & SPI_SR_TCF_MASK) == 0); //等待发送完成
SPI_SR_REG(spi) |= SPI_SR_TCF_MASK; //清除传送完成标志
SPI_SR_REG(spi) |= SPI_SR_RFDF_MASK; //清除RX FIFO不为空标志
SPI_MCR_REG(spi) |= SPI_MCR_HALT_MASK; //停止SPI数据传输
}
|
|