你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

能用的SPI、I2C、SPI FLASH、LCD代码

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。
还不如从小处做起。
这几天鼓捣了几个文件,实现了一些功能。
怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。

现在,我先说说能干啥。

1 有个COG LCD接在SPI接口上,现在要改一下CS脚
用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK
  1. DevSpiCh DevSpi3CH2={
  2.                 "SPI3_CH2",
  3.                 "SPI3",
  4.                
  5.                 MCU_PORT_G,
  6.                 GPIO_Pin_15,
  7.                
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个
好,我们加一个SPI通道
  1. DevSpiCh DevSpi3CH2={
  2.                 "SPI3_CH3",
  3.                 "SPI3",
  4.                
  5.                 MCU_PORT_G,
  6.                 GPIO_Pin_14,
  7.                
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,
  1. DevLcdBus BusLcdSpi3={
  2.         .name = "BusLcdSpi3",
  3.         .type = LCD_BUS_SPI,
  4.         .basebus = "SPI3_CH3",

  5.         .A0port = MCU_PORT_G,
  6.         .A0pin = GPIO_Pin_4,

  7.         .rstport = MCU_PORT_G,
  8.         .rstpin = GPIO_Pin_7,

  9.         .blport = MCU_PORT_G,
  10.         .blpin = GPIO_Pin_9,
  11. };
复制代码
再将LCD挂在这个新的LCD通道上,
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。
你暗地想:完了,要改多少代码啊?
别担心,
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。
  1. _lcd_drv OledLcdSSD1615rv = {
  2.                                                         .id = 0X1315,

  3.                                                         .init = drv_ssd1615_init,
  4.                                                         .draw_point = drv_ST7565_drawpoint,
  5.                                                         .color_fill = drv_ST7565_color_fill,
  6.                                                         .fill = drv_ST7565_fill,
  7.                                                         .onoff = drv_ssd1615_display_onoff,
  8.                                                         .prepare_display = drv_ST7565_prepare_display,
  9.                                                         .set_dir = drv_ST7565_scan_dir,
  10.                                                         .backlight = drv_ST7565_lcd_bl
  11.                                                         };
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈)
4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?
不急,
定义一条I2C通道
  1. DevI2c DevVi2c1={
  2.                 .name = "VI2C1",
  3.                
  4.                 .sclport = MCU_PORT_D,
  5.                 .sclpin = GPIO_Pin_6,

  6.                 .sdaport = MCU_PORT_D,
  7.                 .sdapin = GPIO_Pin_7,
  8.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO
  1. DevLcdBus BusLcdI2C1={
  2.         .name = "BusLcdI2C1",
  3.         .type = LCD_BUS_I2C,
  4.         .basebus = "VI2C1",

  5.         /*I2C接口的LCD总线,不需要其他IO*/

  6. };
复制代码
把LCD挂到这个LCD接口上去
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。

额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。

5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额
没事,至少I2C,SPI ,LCD 不用怎么改,
只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码


有意思吗?
简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。

但是如果你做过设备多一点的项目,可能会觉得有点意思。
因为你有可能遇到过:
1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。
2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?

有兴趣的自行下载附件。

代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch

代码是整个系统的,包含了很多其他代码,
上面说的内容,主要在:
  1. mcu_bsp_stm32.c   IO口操作封装
  2. mcu_i2c.c   I2C核心代码
  3. mcu_spi.c     SPI控制器和SPI通道核心代码
  4. dev_ILI9341.c  彩屏驱动
  5. dev_lcdbus.c    封装LCD硬件接口
  6. dev_lcd.c       LCD统一对上层接口
  7. dev_str7565.c   COG LCD 、OLED LCD驱动
  8. dev_spiflash.c   spi flash 驱动
复制代码


stm32f407.rar

下载

4.93 MB, 下载次数: 85

评分

参与人数 1 ST金币 +8 收起 理由
五哥1 + 8 很给力!

查看全部评分

收藏 5 评论11 发布时间:2018-5-11 12:21

举报

11个回答
zero99 回答时间:2018-5-17 08:55:42
学习了
wujique 回答时间:2018-5-29 09:22:52
最新的代码请到github上获取,仓库会持续更新修正BUG优化性能
勿忘心安110 回答时间:2018-6-21 19:54:19
学习了
勿忘心安110 回答时间:2018-6-21 19:55:34
请问你的GitHub网址是多少?
Kevin_G 回答时间:2019-2-21 10:03:03
很给力!
wdliming-222461 回答时间:2019-2-24 22:20:01
谢谢分享~~
caiyangan 回答时间:2019-2-25 02:14:44
感谢楼主学习一些
西点钟灵毓秀 回答时间:2019-2-25 09:29:58
能用的SPI、I2C、SPI FLASH、LCD代码
sincomaster 回答时间:2019-2-25 10:52:20
谢谢分享,很不错
wujique 回答时间:2019-2-26 16:15:38

觉得可以的话,欢迎关注github获取最新代码

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版