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)!