自学内容网 自学内容网

STM32 I2C案例2:硬件实现I2C 代码书写

STM32的 I2C 外设可用作通讯的主机及从机

STM32的 I2C 外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。

STM32的I2C外设还支持 SMBus2.0协议,SMBus协议与I2C类似。

SMBus2.0硬件层面支持报警操作。

上拉电阻因为有电阻,所以电容会缓慢上电,所以电平会是缓慢上升,下降时电容接地,因为没有电阻阻拦,所以成为低电平用时会非常短,接近无。

NOSTERETCH 位禁止时钟延长:从设备会将SCL线拉低,告诉主设备传输太快,主设备会停止,直到从设备拉高。

创建:interface(接口层)

Interface->EEPROM->m24c02.h

#ifndef __M24C02_H__
#define __M24C02_H__

#include "soft_i2c.h"

#define READ_ADDR 0xA1
#define WRITE_ADDR 0xA0

void M24C02_Init(void);
//写一个字节
void M24C02_SaveByte(uint8_t byte,uint8_t addr);
//读一个字节
uint8_t M24C02_ReadByte(uint8_t addr);
//写多个字节
void M24C02_SaveBytes(uint8_t *bytes,uint8_t len,uint8_t  start_addr);
//读多个字节
void M24C02_ReadBytes(uint8_t *buffer,uint8_t len,uint8_t  start_addr);

#endif /* __M24C02_H__ */

Interface->EEPROM->m24c02.c

#include "m24c02.h"

void M24C02_Init(void)
{
    I2C_Init();
}

void M24C02_SaveByte(uint8_t byte, uint8_t addr)
{
    I2C_Start();
    I2C_SendByte(WRITE_ADDR);
    I2C_Wait4ACK();
    I2C_SendByte(addr);
    I2C_Wait4ACK();
    I2C_SendByte(byte);
    I2C_Wait4ACK();
    I2C_Stop();
    Delay_ms(5);
}

uint8_t M24C02_ReadByte(uint8_t addr)
{
    I2C_Start();
    I2C_SendByte(WRITE_ADDR);
    I2C_Wait4ACK();
    I2C_SendByte(addr);
    I2C_Wait4ACK();
    I2C_Start();
    I2C_SendByte(READ_ADDR);
    I2C_Wait4ACK();
    uint8_t result = I2C_ReceiveByte();
    I2C_NOACK();
    return result;
}

void M24C02_SaveBytes(uint8_t *bytes, uint8_t len, uint8_t start_addr)
{
    I2C_Start();
    I2C_SendByte(WRITE_ADDR);
    I2C_Wait4ACK();
    I2C_SendByte(start_addr);
    I2C_Wait4ACK();
    for (uint8_t i = 0; i < len; i++)
    {
        I2C_SendByte(bytes[i]);
        I2C_Wait4ACK();
    }
    I2C_Stop();
    Delay_ms(5);
}

void M24C02_ReadBytes(uint8_t *buffer, uint8_t len, uint8_t start_addr)
{
    I2C_Start();
    I2C_SendByte(WRITE_ADDR);
    I2C_Wait4ACK();
    I2C_SendByte(start_addr);
    I2C_Wait4ACK();
    

    I2C_Start();
    I2C_SendByte(READ_ADDR);
    I2C_Wait4ACK();

    for (uint8_t i = 0; i < len; i++)
    {
        buffer[i] = I2C_ReceiveByte();
        if (i == len - 1)
        {
            I2C_NOACK();
        }else{
            I2C_ACK();
        }  
    }

    I2C_Stop();
}

User->main.c

#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "soft_i2c.h"
#include "m24c02.h"


int main(void){
Usart1_Init();
M24C02_Init();

M24C02_SaveByte('b',0x02);
uint8_t v = M24C02_ReadByte(0x02);
printf ("%c\n",v);

uint8_t * str = "hello";
M24C02_SaveBytes(str,strlen((const char *)str),0x03);
uint8_t buffer[10] = {0};
M24C02_ReadBytes(buffer,10,0x03);
printf("%s",buffer);

while (1)
{
}

}

VOFA+软件验证

如果换成字符串展示的话:


原文地址:https://blog.csdn.net/qq_64219867/article/details/144183108

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!