专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
AT24C01模拟IIC口,自己写的可以直接移植
2019-12-31 19:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
7975
11
11
本帖最后由 zhcj66 于 2014-2-21 16:18 编辑
AT24C01模拟IIC口,自己写的可以直接移植,
看了网上很多发的模拟IIC写的AT24C01有的修改一下就可以,但是有些还是无法运行,今天正好有时间,我也写了一个,不过是AVR的,修改一点点就可以直接用了。
看到stm32/8这个地方比较活跃,所以就发到这里了。希望斑竹不要介意(目的为了让大家共同学习),同时也感谢阿莫论坛,在这里学到了很多。
废话少说上代码
/**
******************************************************************************
* @File :I2C.c
* @Author :Flame
* @Email :
* @Version :V1.0.0
* @FileNewDate :2014-02-21
* @FileChangeDate :2014-02-21
* @Brief :AT24C01读写程序,包含全部填充,测试成功。mcu采用的AVR-8MHZ
******************************************************************************
*/
#include "includes.h"
#define IIC_SDA_PIN BIT(2)
#define IIC_SDA_PORTx PORTB
#define IIC_SDA_DDRx DDRB
#define IIC_SDA_PINx PINB
#define IIC_SCL_PIN BIT(3)
#define IIC_SCL_PORTx PORTB
#define IIC_SCL_DDRx DDRB
#define IIC_SCL_PINx PINB
#define IIC_SDA_SET IIC_SDA_PORTx |= IIC_SDA_PIN
#define IIC_SDA_CLR IIC_SDA_PORTx &=~IIC_SDA_PIN
#define IIC_SDA_Get IIC_SDA_PINx & IIC_SDA_PIN
#define IIC_SCL_SET IIC_SCL_PORTx |= IIC_SCL_PIN
#define IIC_SCL_CLR IIC_SCL_PORTx &=~IIC_SCL_PIN
#define IIC_SCL_Get IIC_SCL_PINx & IIC_SCL_PIN
#define IIC_ReadAddr 0xA1 //器件地址以及读取操作
#define IIC_WriteAddr 0xA0 //器件地址以及写入操作
#define IIC_MaxAddr 0xFF //AT24C02最大地址
void IIC_Delays(unsigned char ms)
{
static unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
//把SDA管脚设置为输入
void IIC_SDA_IN(void)
{
IIC_SDA_DDRx &= ~IIC_SDA_PIN;
}
//把SDA管脚设置为输出
void IIC_SDA_OUT(void)
{
IIC_SDA_DDRx |= IIC_SDA_PIN;
}
void IIC_Start(void)
{
IIC_SDA_OUT();
IIC_SDA_SET;
IIC_SCL_SET;
NOP();
NOP();
IIC_SDA_CLR;
NOP();
NOP();
NOP();
NOP();
IIC_SCL_CLR;
}
void IIC_Stop(void)
{
IIC_SDA_OUT();
IIC_SDA_CLR;
NOP();
NOP();
IIC_SCL_SET;
NOP();
NOP();
NOP();
NOP();
IIC_SDA_SET;
}
void IIC_Send(unsigned char Byte)
{
static unsigned char i;
IIC_SDA_OUT();
for (i = 0; i < 8; i++)
{
if((Byte & 0x80) == 0x80)
{
IIC_SDA_SET;
}
else
{
IIC_SDA_CLR;
}
NOP();
IIC_SCL_SET;
NOP();
NOP();
IIC_SCL_CLR;
Byte = Byte << 1;
}
IIC_SDA_SET;
NOP();
NOP();
IIC_SCL_SET;
NOP();
NOP();
NOP();
NOP();
IIC_SCL_CLR;
}
unsigned char IIC_Read(void)
{
static unsigned char i,read_data;
IIC_SDA_IN();
for (i = 0; i < 8; i++)
{
IIC_SCL_SET;
read_data <<= 1;
if(IIC_SDA_Get)
{
read_data = read_data | 0x01;
}
IIC_SCL_CLR;
}
return read_data;
}
void IIC_WriteByte(unsigned char Addr,unsigned char Data)
{
IIC_Start();
IIC_Send(IIC_WriteAddr);
IIC_Send(Addr);
IIC_Send(Data);
IIC_Stop();
IIC_Delays(15);//如果填写偶数失败时,可以增加延时时间
}
void IIC_FillByte(unsigned char Data)//填充数据Data到整个EEPROM内
{
static unsigned char i;
for(i = 0; i < IIC_MaxAddr; i++)
{
IIC_WriteByte(i, Data);
WDR();//喂狗
}
}
unsigned char IIC_ReadByte(unsigned int ReadAddr)
{
static unsigned char read_data;
IIC_Start();
IIC_Send(IIC_WriteAddr);
IIC_Send(ReadAddr);
IIC_Start();
IIC_Send(IIC_ReadAddr);
read_data = IIC_Read();
IIC_Stop();
return read_data;
}
void IIC_Init(void)
{
unsigned char temp,i;
IIC_SCL_SET;
IIC_SDA_SET;
IIC_SDA_DDRx |= IIC_SDA_PIN;
IIC_SCL_DDRx |= IIC_SCL_PIN;
IIC_FillByte(0x68);
for(i = 0 ; i < 255; i++)
{
temp = IIC_ReadByte(i);
USART1_tx(temp);
delay_nms(20);
WDR();
}
for(i = 0 ; i < 255; i++)
{
IIC_WriteByte(i,i);
delay_nms(20);
if(i = IIC_ReadByte(i))
{
USART1_tx(i);
delay_nms(20);
WDR();
}
}
while(1)WDR();
}
复制代码
有不恰当的地方希望给予支出,谢谢
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
foxpro2005
2020-01-01 15:37
呵呵 ,AVR,可以放心的用中断去完成,
加载中...
查看其它11个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>