查看: 2927|回复: 1

[求助] Cortex-M4 K60 SPI驱动液晶的问题

[复制链接]

该用户从未签到

4

主题

14

帖子

0

新手上路

Rank: 1

积分
22
最后登录
1970-1-1
发表于 2013-9-13 09:54:21 | 显示全部楼层 |阅读模式
 我用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数据传输
}
 
我知道答案 目前已有0人回答
回复

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

新手上路

Rank: 1

积分
4
最后登录
1970-1-1
发表于 2014-1-6 11:05:00 | 显示全部楼层

回复:我也有同样的问题

我也有同样的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-18 21:43 , Processed in 0.089439 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表