summaryrefslogtreecommitdiff
path: root/bsp/essemi/es32f0654/drivers/bsp_driver_example/i2c_sample.c
blob: 2d386433c63a7a1a1cb61ab1a7891adf632c7b9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-12-15     liuhy       first implementation.
 */
/*
 * 程序清单:这是一个 I2C 设备使用例程
 * 例程导出了 i2c_io_sample 命令到控制终端
 * 命令调用格式:i2c_io_sample
 * 命令解释:使用默认的I2C总线设备
 * 程序功能:通过 I2C 设备接收数据并打印,然后将接收的字符加1输出。
*/

#include <rtthread.h>
#include <rtdevice.h>

#define I2C_BUS_NAME          "i2c1"  /* I2C总线设备名称 */
#define SLAVE_ADDR                  0x2D    /* 从机地址 */
#define STR_LEN                       16    /* 接收发送的数据长度 */

static void i2c_io_sample(int argc, char *argv[])
{
    
    struct rt_i2c_bus_device *i2c_bus = RT_NULL;     /* I2C总线设备句柄 */
    struct rt_i2c_msg temp_msg;                             /* I2C消息 */
    rt_uint8_t buffer[STR_LEN] = { 0U }; 
    rt_uint32_t i,num_msg;
    rt_size_t s_stat;
    
    i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C_BUS_NAME);    /* 通过名字获取I2C总线设备的句柄 */
    
    if( i2c_bus == RT_NULL)
    {
        rt_kprintf("can't find i2c device :%s !\n",I2C_BUS_NAME);
        
        return;
    }
    
        /*初始化消息*/
        temp_msg.addr = SLAVE_ADDR;  /* 从机地址 */
        temp_msg.len  = STR_LEN;     /* 传输的数据长度 */
        temp_msg.buf = buffer;       /* 读写缓存器 */
    
        num_msg = 1;             /* 传输一条消息 */
    
        temp_msg.flags = RT_I2C_RD;             /* I2C读 */
        s_stat = rt_i2c_transfer(i2c_bus,&temp_msg,num_msg);   /* 传输消息 */
        
        rt_thread_mdelay(400); 
        
        if( s_stat == num_msg )
        {
            rt_kprintf("receive successful. \n receive messege : %s \n:",buffer);
            
            for( i = 0 ; i < STR_LEN ; i++)
            rt_kprintf(" %x",(unsigned int)buffer[i]);
            
            rt_kprintf("\n");
        }
        else
        {
            rt_kprintf("device s% recieve fail \n buffer : s%\n",I2C_BUS_NAME,buffer);
            return;
        }
        
        for( i = 0 ; i < STR_LEN ; i++)
        buffer[i]++;
    
        temp_msg.flags = RT_I2C_WR;             /* I2C写 */
        s_stat = rt_i2c_transfer(i2c_bus,&temp_msg,num_msg);   /* 传输一条 */
        
        rt_thread_mdelay(400);
        
        if( s_stat == num_msg )
        {
            rt_kprintf(" send successful \n messege : %s \n:",buffer);
            
            for( i = 0 ; i < STR_LEN ; i++)
            rt_kprintf(" %x",(unsigned int)buffer[i]);
            
            rt_kprintf("\n");
        }
        else
        {
            rt_kprintf("device s% send fail \n",I2C_BUS_NAME);
            return;
        }
        
        return;
    
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(i2c_io_sample, i2c io sample);