历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2021年09月26日 | 基于IAR开发环境的STM8S模拟IIC代码

发布者:blazings 来源: eefocus关键字:IAR  开发环境  STM8S  模拟IIC 手机看文章 扫描二维码
随时随地手机看文章

基于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)


{


        uint8_t bReadError标志寄存器 = FALSE;        //读EEPROM错误标志位

[1] [2]
关键字:IAR  开发环境  STM8S  模拟IIC 引用地址:基于IAR开发环境的STM8S模拟IIC代码

上一篇:STM8S GPIO模拟I2C的底层代码
下一篇:STM8S105 GPIO寄存器方法

推荐阅读

全球领先的嵌入式解决方案供应商赛普拉斯半导体公司(纳斯达克代码:CY)近日宣布,正式推出全新的蓝牙®音频产品,为无线耳机和戴听式设备用户提供领先的性能体验。该解决方案基于无线音频立体声同步(WASS™)应用和CYW20721蓝牙及低功耗蓝牙(BLE)音频MCU,能够为无线耳机提供十分稳定可靠的无线连接,让用户享受差异化的性能体验。与竞品相比,新产品...
据美国科技媒体The Verge报道,波士顿动力的首款重要机器人即将上市。自6月份以来,公司一直在计划向市场发布一款名为“Spot”的机器人(即原先的SpotMini)。今天,波士顿动力终于带来了更多机器人的上市细节。Spot不会直接在市面上出售,但如果你是一家有创意(也顺便不缺钱)的公司,你将有机会获得一台。这意味着,对于大多数普通人而言,在大街上看...
在9月17日的云栖大会上,阿里巴巴发布首款物流机器人“小蛮驴”。通过自动驾驶技术与产业、场景融合,搭建新的智能机器人平台来解决物流问题。过去的半年,一场前所未有的疫情深刻地影响了人们的生产和生活,包括智慧物流在内的科技的力量被彰显,各大物流公司拥抱智慧物流的脚步大幅加快,带动智慧物流产业链进入高速增长阶段。据一位智慧物流供应链人士...
前言我们在学习4412的时候,我们原本的中断地址已经被IROM和IRAM占据了,并且不允许被修改,所以我们只能去选取高端地址0xffff 0000高端地址,但是这一片地址属于虚拟地址,所以我们需要开启MMUMMU定义MMU功能,(memory management unit) 内存管理单元,MMU是硬件的内存管理器件,使用硬件方式对内存进行映射管理。将物理内存 0X4000 0000 - 0X80...

史海拾趣

问答坊 | AI 解惑

S波段接收前端用单片混频器的CAD

提要 报道了S波段接收前端用单片混频器的设计方法,运用LIBRA软件对混频器进行谐波平衡分析与优化,结果表明该软件是进行非线性电路设计很有效的工具。…

查看全部问答∨

AVR单片机ADC的应用

AVR单片机ADC的应用 1.数模转换的基础知识         数模转换器(ADC)基本上是一个比例上的问题,即由ADC产生的数字值跟输入模拟量与转换器量程的比值有关的。转换关系如下:            Vin/Vfullscale ...…

查看全部问答∨

FPGA开发资料大集合

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自制活动正在开展,已出原理图,欢迎积极参与

315avr自制活动正在开展,已出原理图,欢迎积极参与... 1. 自制"M16/32标准学习开发板"活动主题贴地址:http://www.315avr.com/bbs/dispbbs.asp?boardID=3&ID=191&page=1 2. "自制USB AVR JTAGICE仿真器+AVRISP下载器"活动主题贴地址 ...…

查看全部问答∨

mount 不上

root@arago:/# mount /dev/mtdblock4 /mnt/aaa/ mtdblock_open ok mtdblock: read on "filesystem" at 0x0, size 0x200 end_request: I/O error, dev mtdblock4, sector 0 FAT: unable to read boot sector mtdblock_release nand_sync: ...…

查看全部问答∨

Xscale处理器的数据/地址总线原理请教

我手上有一个基于Xscale处理器pxa255的开发板hyper255B,通过查看原理图,查到了以下东西: 1.有一个三八译码器(74LCX138),译码器的三个输入端分别连在地址总线SA-A20到SA-A22上; 2.上面的译码器的一个输出端接的另外一个器件74LCX245的的使能端上,7 ...…

查看全部问答∨

探讨一下高速脉冲输出设计

项目要驱动步进电机,步进电机驱动芯片是脉冲输入的,实际项目最高的脉冲频率<20KHz,脉冲数要用32位长度。计划用两定时器:一个定时器根据频率计算出周期,然后设置预分频系数和计数值,由硬件引脚输出一个PWM(占空比50%)。另一个定时器设置 ...…

查看全部问答∨

哪位大侠帮我选个元件:汽车用TVS管

我做的汽车上用的一个小电路,24V供电,但发动机供电时给他的冲击很大,有时可以到240V,请问用哪一个TVS管比较安全,谢谢!有回答可以给我:pghplh@126.com…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved