3008|3

205

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【FM33LG0系列开发板测评】05.I2C、SPI [复制链接]

 

1、介绍

FM33LG0系列MCU最多带有1路支持主从模式的I2C接口和3路支持主从模式的SPI接口;其中I2C支持7位或10位的从机地址,在传输速度上支持100kbps的标准模式、400kbps的快速模式和1Mbps的超快模式三种速度,且支持唤醒功能,唯一遗憾的就是不支持多主机模式;对于SPI接口,全双工4线串行收发,可以自定义数据字长为8/16/24/32位,方便应用在不同的场合;有专用于TFT屏驱动的半双工4线串行同步收发模式;对于MISO和MOSI这两个信号引脚,可以通过软件配置交换引脚顺序,万一硬件工程师一不小心连错了线,也不用担心重新修改硬件,很方便。

 

2、实现功能

在开发板上已经将1路I2C和2路SPI接口通过排针的形式引出来了,我们通过I2C接口和SPI1接口分别来驱动两块OLED屏,一块OLED屏为I2C通讯接口,另外一块OLED屏为SPI接口;结合上篇帖子实现的RTC功能,显示时钟动画和当前的日期和时间信息;

 

3、主要代码

OLED1:I2C

/*******************************************************************************
 * [url=home.php?mod=space&uid=159083]@brief[/url] * @param       
 * @retval      
 * [url=home.php?mod=space&uid=1020061]@attention[/url] *******************************************************************************/
void OLED1_InitI2C(void)
{
    FL_GPIO_InitTypeDef           GPIO_InitStruct;
    FL_I2C_MasterMode_InitTypeDef I2C_InitStruct;

    FL_GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.pin        = FL_GPIO_PIN_11 | FL_GPIO_PIN_12;
    GPIO_InitStruct.mode       = FL_GPIO_MODE_DIGITAL;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_OPENDRAIN;
    GPIO_InitStruct.pull       = FL_DISABLE;
    FL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    I2C_InitStruct.clockSource = FL_CMU_I2C_CLK_SOURCE_APBCLK;
    I2C_InitStruct.baudRate    = 400000;
    FL_I2C_MasterMode_Init(I2C, &I2C_InitStruct);
}

……

/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void OLED1_DrawImage(uint8_t Width, uint8_t Height, const uint8_t *ImageData)
{
    uint8_t  x = 0, y = 0;
    uint8_t  Buffer[0x80];
    uint16_t Index    = 0;

    for(y = 0; y < Height / 8; y++)
    {
        OLED1_SetPosition(32, y);

        for(x = 0; x < Width; x++)
        {
            Buffer[x] = ImageData[Index++];
        }

        OLED1_WriteBuffer(Buffer, Width);
    }
}


/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void OLED1_Init(void)
{
    OLED1_InitI2C();

    OLED1_InitCFG();

    OLED1_Clear(0x00);

    TASK_Append(TASK_ID_OLED1, OLED1_Handler, 100);
}

……

 

OLED2:SPI

/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void OLED2_InitSPI(void)
{
    FL_DMA_InitTypeDef  DMA_InitStruct;
    FL_GPIO_InitTypeDef GPIO_InitStruct;
    FL_SPI_InitTypeDef  SPI_InitStruct;

    FL_SPI_StructInit(&SPI_InitStruct);
    SPI_InitStruct.baudRate      = FL_SPI_BAUDRATE_DIV2;
    SPI_InitStruct.bitOrder      = FL_SPI_BIT_ORDER_MSB_FIRST;
    SPI_InitStruct.clockPhase    = FL_SPI_PHASE_EDGE1;
    SPI_InitStruct.clockPolarity = FL_SPI_POLARITY_NORMAL;
    SPI_InitStruct.dataWidth     = FL_SPI_DATA_WIDTH_8B;
    SPI_InitStruct.mode          = FL_SPI_WORK_MODE_MASTER;
    SPI_InitStruct.softControl   = FL_ENABLE;
    SPI_InitStruct.transferMode  = FL_SPI_TRANSFER_MODE_FULL_DUPLEX;
    FL_SPI_Init(SPI1, &SPI_InitStruct);

    FL_DMA_StructInit(&DMA_InitStruct);
    DMA_InitStruct.circMode = FL_DISABLE;
    DMA_InitStruct.dataSize = FL_DMA_BANDWIDTH_8B;
    DMA_InitStruct.direction = FL_DMA_DIR_PERIPHERAL_TO_RAM;
    DMA_InitStruct.memoryAddressIncMode = FL_DMA_MEMORY_INC_MODE_INCREASE;
    DMA_InitStruct.priority = FL_DMA_PRIORITY_HIGH ;
    DMA_InitStruct.periphAddress = FL_DMA_PERIPHERAL_FUNCTION1;
    FL_DMA_Init(DMA, &DMA_InitStruct, FL_DMA_CHANNEL_3);

    FL_DMA_StructInit(&DMA_InitStruct);
    DMA_InitStruct.circMode = FL_DISABLE;
    DMA_InitStruct.dataSize = FL_DMA_BANDWIDTH_8B;
    DMA_InitStruct.direction = FL_DMA_DIR_RAM_TO_PERIPHERAL;
    DMA_InitStruct.memoryAddressIncMode = FL_DMA_MEMORY_INC_MODE_INCREASE;
    DMA_InitStruct.priority = FL_DMA_PRIORITY_HIGH ;
    DMA_InitStruct.periphAddress = FL_DMA_PERIPHERAL_FUNCTION2;
    FL_DMA_Init(DMA, &DMA_InitStruct, FL_DMA_CHANNEL_4);

    FL_GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.pin        = FL_GPIO_PIN_2 | FL_GPIO_PIN_3 |
                                 FL_GPIO_PIN_4 |FL_GPIO_PIN_5;
    GPIO_InitStruct.mode       = FL_GPIO_MODE_DIGITAL;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    FL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}

……

/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void OLED2_Init(void)
{
    OLED2_InitSPI();

    OLED2_HardwareReset();

    OLED2_ConfigureREG();

    OLED2_Clear(0x00);

    TASK_Append(TASK_ID_OLED2, OLED2_Handler, 500);
}


/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void OLED_ShowChar(uint8_t X, uint8_t Y, char ch, uint8_t Size)
{  
    uint8_t Data = 0;

    for(uint8_t i = 0; i < Size; i++)
    {
        OLED2_SetPosition(X + i, Y);

        if(Size == 12)
        {
            Data = ASCII_1206[ch - 0x20][i];
        }
        else
        {
            Data = ASCII_1608[ch - 0x20][i];
        }

        OLED2_WriteDAT(Data);
    }
}

……

 

4、运行效果


 

 

5、工程源源

Project_I2C_SPI.zip (379.68 KB, 下载次数: 22)

 

最新回复

楼主讲的这个ISO和MOSI引脚,可以通过软件配置交换引脚顺序,这个好   详情 回复 发表于 2021-12-13 23:46
点赞(1) 关注
个人签名We are a team and we work as a team !
 
 

回复
举报

205

帖子

0

TA的资源

纯净的硅(初级)

沙发
 

运行效果视频刚上传,还在转换格式中……

个人签名We are a team and we work as a team !
 
 
 

回复

6587

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

楼主讲的这个ISO和MOSI引脚,可以通过软件配置交换引脚顺序,这个好

 
 
 

回复

205

帖子

0

TA的资源

纯净的硅(初级)

4
 
Jacktang 发表于 2021-12-13 23:46 楼主讲的这个ISO和MOSI引脚,可以通过软件配置交换引脚顺序,这个好

个人签名We are a team and we work as a team !
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表