嵌入式培训—12.23

① I2C(内部集成总线)

        (1)SDK时钟线;

        (2)SDA数据线;

(节省硬件资源)

② 传输协议(信号独立于数据):

        (1)起始信号:SCL高电平时,SDA为下降沿时;

        (2)结束信号:SCL高电平时,SDA为上升沿时;

        (3)校验:握手(接收方应答):

                < 1 > ACK:应答,数据线低电平;

                < 2 > NACK:非应答,数据线高电平;

        (1)时序:


                < 1 > SCL:第1—7 bit 从设备地址 + 第8 bit 传输方向(0—主向从发,1                                             —从向主发)+ 第9 bit 校验位(应答);

----------------------------------------------------------------------------------------------

                          SDA:8 bit 有效数据 + 1 bit 校验位(应答);

                < 2 >在时钟线的低电平进行数据线的电平变换;

                < 3 >在时钟线的高电平进行锁存;

                < 4 >数据格式高位在前(MSB);

③ 地址

        (1)设备号(设备地址):

        E2PROM:

                < 1 > ROM只读存储器;

                        A . PROM   (可编程存储器);

                        B . EPROM (可擦写编程存储器);

                        C . E2PROM (电信号可擦写编程存储器),存储量小,造价高;


                        Flash:

                                a . NorFlash ;

                                b . NandFlash ;


                < 2 > RAM随机存储器;

                        A . SRAM (静态存储器),造价高;

                        B . DRAM (动态存储器),需要定时刷新(电容充电);

                        C . SDRAM ;

                        D . DDR ;

        (2)设备内地址;

④ 端序

        (1)大端序:高位在低地址;

        (2)小端序:高位在高地址;

⑤E2PROM

        (1)写:起始 + 设备号 + 传输方向(0) + 应答 + 从设备内地址 + 应答 + 多个数                         据(从设备应答)+结束信号;

                按字节写:每写一个地址,带一个地址;

                按页写:大小1—16字节,跨页重发地址;

       (2)读:起始 + 设备号 + 传输方向(0) + 应答 + 从设备内地址 + 应答 + 起始位                         +设备号 + 传输方向(1) + 应答 +  多个数据(主设备应答)+                         主设备非应答 + 结束;

⑥ 使用I2C实现串口通信

        代码:

#include "mapp.h"

#define E2PROM_ID        0xA0

#define E2PROM_Timeout  0xFFFF

int  Layer = 0;

uint8_t Layer_Buf[4][100]={"Hello,world !\r\n", "Hello,Sean !\r\n", "Hello,Tom !\r\n", "Hello,Billy !\r\n"};

/********************

HAL¿âº¯Êý

*****************/

void e2prom_read(uint8_t madd,uint8_t *buf,uint32_t size)

{

HAL_I2C_Mem_Read(& hi2c1, E2PROM_ID,madd, 1,buf, size, E2PROM_Timeout);

HAL_Delay(2);

}

void e2prom_write(uint8_t madd,uint8_t *buf,uint32_t size)

{

uint32_t i;

for(i=0;i<size;i++)

{

//µ¥×Ö½Úд

HAL_I2C_Mem_Write(&hi2c1, E2PROM_ID, madd, 1, &buf[i], 1, E2PROM_Timeout);

madd++;

HAL_Delay(2);

}

}

void I2C_Tel()

{

uint8_t buf[100];

if(Layer == 0)

{

e2prom_write(0,Layer_Buf[0],15);

memset(buf,0,100);

e2prom_read(0,buf,15);

printf("%s",buf);

}

if(Layer == 1)

{

e2prom_write(64,Layer_Buf[1],14);

memset(buf,0,20);

e2prom_read(64,buf,14);

printf("%s",buf);

}

if(Layer == 2)

{

e2prom_write(128,Layer_Buf[2],13);

memset(buf,0,20);

e2prom_read(128,buf,13);

printf("%s",buf);

}

if(Layer == 3)

{

e2prom_write(192,Layer_Buf[3],15);

memset(buf,0,20);

e2prom_read(192,buf,15);

printf("%s",buf);

}

}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_0)

{

Layer ++;

if(Layer > 3)

Layer = 0;

I2C_Tel();

}

if(GPIO_Pin == GPIO_PIN_13)

{

Layer --;

if(Layer < 0)

Layer = 3;

I2C_Tel();

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就...
    停下浮躁的心阅读 7,010评论 0 3
  • 一、Bootloader固件升级 RT-Thread ST固件更新过程 RT-Thread 通用 Bootload...
    Mr_Michael阅读 4,060评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,214评论 0 3
  • 其实这篇文章主要是介绍自己为其写的GPIO库,自己借鉴了原子写的STM32,野火写的K60,还有LPC官方库,然后...
    杨奉武阅读 1,023评论 0 0
  • 民生在勤,勤则不匮。
    史介鸿阅读 266评论 0 1

友情链接更多精彩内容