查看: 3892|回复: 5

[已解决] KL46 SPI的初始化程序问题(已解决)

[复制链接]

该用户从未签到

6

主题

30

帖子

0

注册会员

Rank: 2

积分
87
最后登录
1970-1-1
发表于 2014-8-1 20:43:29 | 显示全部楼层 |阅读模式
本帖最后由 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的,但是一直没能实现,大家能帮忙看看这段代码有什么问题吗?
我知道答案 目前已有5人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-8-4 09:06:20 | 显示全部楼层

    回复:KL46 SPI的初始化程序

    楼主你好
    首先你提到的“从冷火KL25移植到我KL46上的SPI初始化程序”到底是第三方野火还是飞思卡尔的Coldfire产品?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-8-4 09:07:43 | 显示全部楼层

    回复:KL46 SPI的初始化程序

    其次KL25 SPI寄存器地址和KL46 SPI寄存器地址不同,请问你是否有注意过呢?
    寄存器地址可以从芯片参考手册里找到。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    30

    帖子

    0

    注册会员

    Rank: 2

    积分
    87
    最后登录
    1970-1-1
     楼主| 发表于 2014-8-5 09:18:40 | 显示全部楼层

    回复:KL46 SPI的初始化程序

    回复第 2 楼 于2014-08-04 09:06:20发表:
    楼主你好
    首先你提到的“从冷火KL25移植到我KL46上的SPI初始化程序”到底是第三方野火还是飞思卡尔的Coldfire产品?是我没说清楚,原例程是KL25的野火例程不是冷火。还有寄存器的话我注意过了,基本上是一样的,我移植之后编译时没有错误的,就是实现不了SPI的功能。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-8-5 09:48:47 | 显示全部楼层

    回复:KL46 SPI的初始化程序

    回复第 4 楼 于2014-08-05 09:18:40发表:
    回复第 2 楼 于2014-08-04 09:06:20发表:
    楼主你好
    首先你提到的“从冷火KL25移植到我KL46上的SPI初始化程序”到底是第三方野火还是飞思卡尔的Coldfire产品?是我没说清楚,原例程是KL25的野火例程不是冷火。还有寄存器的话我注意过了,基本上是一样的,我移植之后编译时没有错误的,就是实现不了SPI的功能。
     

     

    我这看了一下寄存器,两者区别蛮大的呀,地址都不对。 KL46的SPI还多了很多寄存器
    下图截自KL25P80M48SF0RM:
    SPI KL25.jpg
     
    下图截自KL46P121M48SF4RM:
    SPI KL46.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-9-9 11:32:47 | 显示全部楼层
    楼主你好
    请问你的问题解决了吗? 如果问题尚未解决可以继续在帖子中与大家讨论。
    PS:由于你长时间未回帖,所以先把你的帖子标示成已解决了。

    以后问题解决后还请配合我们在帖子标题末添加“(已解决)”字样,谢谢!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 19:33 , Processed in 0.102586 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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