打印
[STM32H7]

【银杏科技ARM+FPGA】分享iCore4T移植RT-Thread过程的点点滴滴

[复制链接]
楼主: heart蓝色CD
手机看帖
扫描二维码
随时随地手机跟帖
21
支持楼主,建议把你的BSP贡献给rt-thread,放到rt-thread的发布版本中,这样有助于icore的应用推广

使用特权

评论回复
22
王紫豪| | 2020-3-14 21:29 | 只看该作者
pkoko 发表于 2020-3-14 16:07
支持楼主,建议把你的BSP贡献给rt-thread,放到rt-thread的发布版本中,这样有助于icore的应用推广 ...

正在弄呢。

使用特权

评论回复
23
晓阳L| | 2020-3-18 08:56 | 只看该作者
讲解的很详细,好好学习一下!

使用特权

评论回复
24
石墨星海| | 2020-3-19 12:04 | 只看该作者
感谢分享

使用特权

评论回复
25
GT01115| | 2020-4-9 17:56 | 只看该作者
很详细呀厉害厉害

使用特权

评论回复
26
GT01115| | 2020-4-14 16:14 | 只看该作者
支持支持,跟着学的

使用特权

评论回复
27
GT01115| | 2020-4-18 20:01 | 只看该作者
反复学习

使用特权

评论回复
28
shcnxjy| | 2020-4-19 08:56 | 只看该作者
感谢分享,学习了!

使用特权

评论回复
29
heart蓝色CD|  楼主 | 2020-4-20 15:52 | 只看该作者
本帖最后由 heart蓝色CD 于 2020-4-20 16:51 编辑

分享iCore4T移植RT-Thread过程的点点滴滴——DAY 8

高手请略过,如有错误请多多批评指点!

iCore4T ARM+FPGA双核心板I2C总线挂有三个设备,分别为AXP152电源管理芯片,LM75A温度传感器,EEPROM存储器,在DAY 7里我给大家分享了LM75A驱动的添加过程,今天我给大家分享最后一个I2C设备EEPROM驱动的添加过程。

EEPROM是一个带电可擦可编程只读存储器,iCore4T ARM+FPGA双核心板挂有一片容量为4KBit的EEPROM可用于一些参数信息的存储。

1、修改kconfig文件,在menuconfig中添加配置EEPROM的选项。


2、添加eeprom驱动程序,并将该文件放在../bsp/stm32/libraries/HAL_Drivers,我把源码贴在下面。
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date           Author       Notes
* 2020-02-17     zh.          first version
*/

#include <board.h>
#include <drv_qspi.h>
#include <rtdevice.h>
#include <rthw.h>
#include <finsh.h>

#ifdef BSP_USING_I2C_EEPROM

/* For eeprom i2c bus*/
#define EEPROM_I2CBUS_NAME     "i2c1"
#define _24LC04B                                                            (0xA0 >> 1)

static struct rt_i2c_bus_device *eeprom_i2c_bus = RT_NULL;

static rt_err_t i2c_write_nbyte(rt_uint8_t slave_addr, rt_uint8_t cmd, rt_uint8_t *value, rt_uint32_t len)
{
    rt_uint32_t i;
    rt_uint8_t *buffer;
    rt_size_t result;
        
    buffer = rt_malloc(len + 1);
        
    buffer[0] = cmd;
        for(i  = 0;i < len;i ++)
        {
                buffer[i+1] = value[i];
        }        
    result = rt_i2c_master_send(eeprom_i2c_bus, slave_addr, RT_I2C_WR, buffer, len+1);
        
        rt_free(buffer);
        
    if (result == (len+1))
    {
        return RT_EOK;      
    }
    else
    {
        return -RT_ERROR;      
    }
}

static rt_err_t i2c_read_nbyte(rt_uint8_t slave_addr, rt_uint8_t cmd, rt_uint8_t *buf, rt_uint32_t len)
{
    rt_i2c_master_send(eeprom_i2c_bus, slave_addr, RT_I2C_WR, &cmd, 1);
   
    rt_i2c_master_recv(eeprom_i2c_bus, slave_addr, RT_I2C_RD, buf, len);
   
    return RT_EOK;
}

rt_uint32_t eeprom_write(rt_uint32_t addr, rt_uint8_t dat)
{
        rt_uint8_t madd;

        if (addr > 255)
        {
                /* select block 0~255 / 256 ~ 511 */
                madd = _24LC04B | 0X01;
                addr -= 256;
        }
        else
        {
                madd = _24LC04B;
        }
        
        i2c_write_nbyte(madd, addr, &dat, 1);

        rt_thread_mdelay(10);

        return 0;
}

rt_uint8_t eeprom_read(rt_uint32_t addr)
{
        rt_uint8_t madd;
        rt_uint8_t dat;

        if(addr > 255)
        {
                /* select block 0~255 / 256 ~ 511 */
                madd = _24LC04B | 0X01;
                addr -= 256;
        }
        else
        {
                madd = _24LC04B;
        }

        i2c_read_nbyte(madd, addr, &dat, 1);

        return dat;
}
static int eerpom_init(void)
{
        eeprom_i2c_bus = rt_i2c_bus_device_find(EEPROM_I2CBUS_NAME);

    if(eeprom_i2c_bus == RT_NULL)
    {
        rt_kprintf("i2c_bus %s for lm75a not found!\n", eeprom_i2c_bus);
        return -RT_ERROR;                        
    }
        else
        {
                return RT_EOK;
        }
}
INIT_COMPONENT_EXPORT(eerpom_init);

static int eeprom(int argc, char **argv)
{
        int i;
        unsigned char write_buffer[512];
        unsigned char read_buffer[512];
        int result = RT_EOK;
        int address;
        unsigned char data;
        int errors = 0;
        
    if (argc > 1)
    {
                if(!strcmp(argv[0],"eeprom"))
                {
                        if (!strcmp(argv[1], "write"))
                        {
                                if (argc == 4)
                                {
                                        address = atoi(argv[2]);
                                        data = atoi(argv[3]);
                                        if(address < 512 && data <= 255)
                                        {
                                                rt_kprintf("address:%d data:%d\n",address,data);
                                                eeprom_write(address,data);
                                        }
                                        else
                                        {
                                                rt_kprintf("address or data is error!\n");
                                        }
                                }
                                else
                                {
                                        rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                                }
                        }
                        else if (!strcmp(argv[1], "read"))
                        {
                                if (argc == 3)
                                {
                                        address = atoi(argv[2]);
                                       
                                        if(address < 512)
                                        {
                                                data = eeprom_read(address);
                                                rt_kprintf("Read eeprom address %d is %d\n",address,data);
                                        }
                                        else
                                        {
                                                rt_kprintf("address is error!\n");
                                        }
                                }
                                else
                                {
                                        rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                                }
                        }
                        else if (!strcmp(argv[1], "test"))
                        {
                                if (argc == 2)
                                {
                                        for(i = 0;i < 512;i ++)
                                        {
                                                write_buffer[i] = i % 256;
                                        }
                                       
                                        for(i = 0;i < 512;i ++)
                                        {
                                                eeprom_write(i,write_buffer[i]);
                                        }
                                       
                                        for(i = 0;i < 512;i ++)
                                        {
                                                read_buffer[i] = eeprom_read(i);
                                        }
                                       
                                        for(i = 0;i < 512;i ++)
                                        {
                                                if(read_buffer[i] != write_buffer[i])
                                                {
                                                        errors ++;
                                                        rt_kprintf("eeprom error:0x%02x 0x%02x\n",write_buffer[i],read_buffer[i]);
                                                }
                                        }
                                        if(errors)
                                        {
                                                rt_kprintf("eeprom fail!\n");
                                        }
                                        else
                                        {
                                                rt_kprintf("eeprom ok!\n");
                                        }
                                }
                                else
                                {
                                        rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                                }
                        }
                        else
                        {
                                rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                        }
                }
                else
                {
                        rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                }
    }
    else
    {
        rt_kprintf("Usage: \n");
        rt_kprintf("eeprom write <address> <data>   - write data to eeprom\n");
        rt_kprintf("eeprom read  <address>          - read data from eeprom\n");
        rt_kprintf("eeprom test                     - write & read test eeprom\n");
        result = -RT_ERROR;
    }
        
    return result;
}
MSH_CMD_EXPORT(eeprom, eeprom function);
#endif /* BSP_USING_I2C_EEPROM */

3、打开该文件夹下的SConscript文件,添加文件路径,这样生成工程的时候可以自动将该文件加入MDK工程。


4、进入stm32h750-gingko-icore4t文件夹下,右击选择ConEmu Here,打开menuconfig,配置EEPROM。


5、使用scons命令,键入scons --target=mdk5,生成MDK5工程,编译,烧录,就可以进行EEPROM测试了。

6、打开终端,键入eeprom,我们可以看到共有三个函数分别为eeprom测试函数,eeprom写函数,eeprom读函数。


7、读写测试eeprom为整片读写测试,键入eeprom test,测试完成后弹出测试结果。


8、单字节读写操作,我们向空间地址300,写入数据111,并读出进行测试。


至此说明我们的eeprom驱动已经添加成功。

9、源代码
        源代码可以稳步这里下载:
        链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq
        我将在DAY9里面为大家分享W25Q64加入文件系统的过程。


使用特权

评论回复
30
GT01115| | 2020-5-7 18:08 | 只看该作者
又来学习了,今天学习SPI

使用特权

评论回复
31
xiaolin1111| | 2020-6-15 10:41 | 只看该作者
学习学习

使用特权

评论回复
32
GT01115| | 2020-6-20 16:56 | 只看该作者
顶顶顶

使用特权

评论回复
33
abin0415| | 2020-7-8 10:41 | 只看该作者
感谢楼主的分享

使用特权

评论回复
34
GT01115| | 2020-9-10 11:06 | 只看该作者
跟着学习挂载驱动,楼主无偿奉献呀

使用特权

评论回复
35
caigang13| | 2020-9-11 08:14 | 只看该作者
不错,感谢楼主分享

使用特权

评论回复
36
便携手到老| | 2020-9-11 08:45 | 只看该作者
RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统。

使用特权

评论回复
37
明天真的好| | 2020-9-11 09:01 | 只看该作者
git下载地址:https://git-scm.com/downloads。

使用特权

评论回复
38
可爱的烧饼| | 2020-9-11 09:38 | 只看该作者
Env是RTT推出的开发辅助工具,针对基于RTT操作系统项目工程,提供编译构建环境、图形化系统配置及软件包管理功能,其内置的menuconfig提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由剪裁,使用系统以搭积木的方式进行构建。

使用特权

评论回复
39
quickman| | 2020-9-12 22:40 | 只看该作者
stm32用 rt-thread操作系统的串口收发 简单例程?

使用特权

评论回复
40
jstgotodo| | 2020-9-12 22:40 | 只看该作者
rt-thread 怎样修改shell调试串口

使用特权

评论回复
发新帖 本帖赏金 6.66元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则