基于IAR STM8 2.10开发环境,STM8S005K6单片机,模拟IIC方式读写AT24C16或AT24C32,已验证可以正常对AT24C32进行读写数据,只是有个疑问,对于单片机接SDA脚的IO口进行方向控制反而引起时序不正常而读写不了数据,例程中是将此IO口始终设置为输出,不知道会不会有隐患,有待测试...
以下是代码,完整代码请下载附件,包含完整工程!
#include "24Cxx.h"
#include "stm8s.h"
#include "stm8s_gpio.h"
#define AT24C32_SETSDAIN GPIO_Init(AT24C32_SDA_PORT, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT)
#define AT24C32_SETSDAOUT GPIO_Init(AT24C32_SDA_PORT, GPIO_PIN_6, GPIO_MODE_OUT_OD_LOW_SLOW)
#define I2C_SLAW 0xA0 /*器件地址选择及写标志*/
#define I2C_SLAR 0xA1 /*器件地址选择及读标志*/
void nops(void)
{
// asm("nop");
// asm("nop");
uint16_t i = 0;
for (; i < 5; i++);
}
// 总线复位
void I2C_Reset(void)
{
AT24C32_SCL_HIGH;
AT24C32_SDA_HIGH;
}
// I2C操作严重错误
void I2C_Error(void)
{
//复位I2C总线
I2C_Reset();
//进入死循环
while (1)
{
}
}
// 发送起始条件
void I2C_Start_A(void) /*起始条件*/
{
AT24C32_SCL_HIGH;
nops();
AT24C32_SDA_LOW;
nops();
AT24C32_SCL_LOW;
nops();
}
// 停止条件
void I2C_Stop_A(void)
{
AT24C32_SDA_LOW;
nops();
AT24C32_SCL_HIGH;
nops();
AT24C32_SDA_HIGH;
nops();
AT24C32_SCL_LOW;
nops();
}
// 产生一个时钟信号
uint8_t I2C_GenerateClock(void)
{
uint8_t bData = 0;
uint16_t t = 0;
AT24C32_SCL_HIGH;
nops();
for (t = 0; t < 6; t++);
if (AT24C32_READSDA)
{
bData = 1;
}
AT24C32_SCL_LOW;
nops();
return bData;
}
// 应答位
void I2C_Ack(uint8_t bAckYes)
{
if (bAckYes)
{
AT24C32_SDA_LOW;
}
else
{
AT24C32_SDA_HIGH;
}
I2C_GenerateClock();
AT24C32_SDA_HIGH;
}
// 发送数据子程序, ucData为要求发送的数据
uint8_t I2C_Send(uint8_t ucData)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (ucData & 0x80)
{
AT24C32_SDA_HIGH;
}
else
{
AT24C32_SDA_LOW;
}
ucData <<= 1;
I2C_GenerateClock();
}
AT24C32_SDA_HIGH;
return (!I2C_GenerateClock());
}
// 读一个字节的数据,并返回该字节值
uint8_t I2C_Read(void)
{
uint8_t ucData = 0;
uint8_t i;
for (i = 0; i < 8; i++)
{
ucData <<= 1;
if (I2C_GenerateClock())
{
ucData |= 1;
}
}
return ucData;
}
// 设置下一步操作的地址(一字节地址)
uint8_t I2C_SetAddress(uint16_t u16Addr)
{
// 发送启动信号
I2C_Start_A();
// 发送访问地址
return (I2C_Send(I2C_SLAW) && I2C_Send(u16Addr));
}
// 设置下一步操作的地址(两字节地址)
uint8_t I2C_SetAddress16(uint16_t u16Addr)
{
// 发送启动信号
I2C_Start_A();
// 发送从器件地址
// 发送访问地址
return (I2C_Send(I2C_SLAW) && I2C_Send(u16Addr >> 8) && I2C_Send(u16Addr & 0xff));
}
// 向8位地址的器件( 如:24C02 )写数据 bAddressIs16bit = 0
// 向16位地址的器件( 如:24C32 )写数据 bAddressIs16bit = 1
void Write_Byte_24c32(uint8_t *pDat, uint16_t u16Addr, uint8_t ucNbyte, uint8_t bAddressIs16bit)
{
uint8_t bWriteError = FALSE; //写数据出错标志位
uint8_t i;
uint8_t ucDataBuf = 0;
uint32_t Cnt = 0;
for (i = 0; i < ucNbyte; i++)
{
if (bAddressIs16bit)
{
if (I2C_SetAddress16(u16Addr + i) == 0)
{
bWriteError = TRUE;
break;
}
}
else
{
if (I2C_SetAddress(u16Addr + i) == 0)
{
bWriteError = TRUE;
break;
}
}
ucDataBuf = *(pDat + i);
if (I2C_Send(ucDataBuf) == 0)
{
bWriteError = TRUE;
break;
}
I2C_Stop_A();
ucDataBuf = 12;
do
{
I2C_Start_A();
} while ((++Cnt < 500000) && I2C_Send(I2C_SLAW) == 0);
//如果50mS内还没有响应,则进入保护性报警状态
if (Cnt == 500000)
{
bWriteError = TRUE;
break;
}
I2C_Stop_A();
}
if (bWriteError)
{
I2C_Error();
}
}
// 从8位地址的器件( 如:24C02 )读数据 bAddressIs16bit = 0
// 从16位地址的器件( 如:24C32 )读数据 bAddressIs16bit = 1
void Read_nByte_24c32(uint8_t *pDat, uint16_t u16Addr, uint8_t ucNbyte, uint8_t bAddressIs16bit)
{
上一篇:STM8S GPIO模拟I2C的底层代码
下一篇:STM8S105 GPIO寄存器方法
推荐阅读
史海拾趣
随着电子行业的快速发展,Aplus Flash Technology Inc公司意识到单凭自身的力量难以应对市场的快速变化。于是,公司积极寻求与其他企业的战略合作,共同开发新产品、拓展新市场。通过与一家知名手机制造商的合作,Aplus Flash Technology Inc公司的闪存芯片成功应用于多款热销手机中,大大提高了公司的知名度和市场份额。此外,公司还与多家芯片设计公司和半导体制造商建立了紧密的合作关系,共同推动电子行业的发展。
随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。
作为一家领先的电子企业,ETC公司深知自身肩负的社会责任。公司积极履行社会责任,关注环境保护和资源节约。ETC通过引进先进的生产工艺和设备,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了ETC的企业形象,也为公司的可持续发展奠定了坚实的基础。
随着技术的不断进步和市场需求的不断变化,Fagor Electrónica开始将其业务范围扩展到更广泛的电子和数字领域。公司不断推出新的产品和服务,以满足不同客户的需求。同时,Fagor Electrónica还积极拓展国际市场,将其产品销往世界各地。这一时期的多元化发展和市场拓展为公司带来了更大的商业机会和更广阔的市场前景。
品质是Delta的生命线。公司建立了完善的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的质量监控。此外,Delta还注重可持续发展,积极推广环保理念,采用环保材料和节能技术,降低产品对环境的影响。这些措施不仅提高了产品的质量,也为企业赢得了良好的社会声誉。
DS-IMP公司一直将研发创新作为企业发展的核心动力。在研发过程中,公司不断投入大量资金,引进先进设备和技术,并与国内外知名高校和研究机构建立合作关系。通过不懈努力,公司在多个领域取得了重大突破,成功研发出了一系列具有自主知识产权的高性能模拟混合电路产品。这些产品不仅满足了国内外客户的需求,还为公司赢得了良好的市场声誉。
提要 报道了S波段接收前端用单片混频器的设计方法,运用LIBRA软件对混频器进行谐波平衡分析与优化,结果表明该软件是进行非线性电路设计很有效的工具。… 查看全部问答∨ |
AVR单片机ADC的应用 1.数模转换的基础知识 数模转换器(ADC)基本上是一个比例上的问题,即由ADC产生的数字值跟输入模拟量与转换器量程的比值有关的。转换关系如下: Vin/Vfullscale ...… 查看全部问答∨ |
altera FPGA设计初级篇 altera FPGA设计高级篇 https://bbs.eeworld.com.cn/thread-53288-1-2.ht ...… 查看全部问答∨ |
人们可能会对电子产品的开发与设计方法坚持某种不变的观念,甚至对解决不同问题所采用的器件这样的小事都有某种思维 定势,这是可以理解的。 我认识到,对于电子设计人员来说,“熟悉招致轻视”这样的说法并不适用于他们。甚至那些我所认识的最有 ...… 查看全部问答∨ |
谁有<C语言嵌入式系统开发Michael J.Pont 著>的光盘原代码啊,跪求,yingjun329@126.com 谁有<C语言嵌入式系统开发Michael J.Pont 著>的光盘原代码啊,跪求,yingjun329@126.com… 查看全部问答∨ |
315avr自制活动正在开展,已出原理图,欢迎积极参与... 1. 自制"M16/32标准学习开发板"活动主题贴地址:http://www.315avr.com/bbs/dispbbs.asp?boardID=3&ID=191&page=1 2. "自制USB AVR JTAGICE仿真器+AVRISP下载器"活动主题贴地址 ...… 查看全部问答∨ |
我手上有一个基于Xscale处理器pxa255的开发板hyper255B,通过查看原理图,查到了以下东西: 1.有一个三八译码器(74LCX138),译码器的三个输入端分别连在地址总线SA-A20到SA-A22上; 2.上面的译码器的一个输出端接的另外一个器件74LCX245的的使能端上,7 ...… 查看全部问答∨ |
|
项目要驱动步进电机,步进电机驱动芯片是脉冲输入的,实际项目最高的脉冲频率<20KHz,脉冲数要用32位长度。计划用两定时器:一个定时器根据频率计算出周期,然后设置预分频系数和计数值,由硬件引脚输出一个PWM(占空比50%)。另一个定时器设置 ...… 查看全部问答∨ |
我做的汽车上用的一个小电路,24V供电,但发动机供电时给他的冲击很大,有时可以到240V,请问用哪一个TVS管比较安全,谢谢!有回答可以给我:pghplh@126.com… 查看全部问答∨ |