历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | stm8s105调试I2C记录

发布者:Turquoise 来源: eefocus关键字:stm8s105  调试I2C  AR项目 手机看文章 扫描二维码
随时随地手机看文章

最近由于AR项目中调试LCOS需要用到STM8S105的mcu,本次主要是使用模拟I2C。


1.IIC协议简介


 IIC协议这里只做简要介绍,详细介绍可以百度了解,协议相对简单,主要有开始位,停止位,应答位,非应答位。


开始位:当时钟为高,数据线由高变低


停止位:当时钟位高,数据线由低变高。


应答位:第9个时钟到来时,数据线为低。(这里第9个时钟,发送完一个字节,紧接着就是第9个时钟到来)


非应答位,第9个时钟到来时,数据线为高。


2.LCOS协议:


1.发送数据:


单数据发送: 开始位:写地址位(8bit):寄存器地址(16bit):数据(8bit):停止位

多字节发送:开始位:写地址(8bit):寄存器地址(16bit):数据(8bit*N):停止位

2.读取数据:


单字节读取:开始位:写地址(8bit):寄存器地址(16bit):开始位,读地址(8bit):读数据(8bit):停止位


单字节读取:开始位:写地址(8bit):寄存器地址(16bit):开始位,读地址(8bit):读数据(8bit*N):停止位


LCOS驱动源代码:


头文件



#ifndef OP02223_H_

#define OP02223_H_

 

#include "stm8s.h"

#include "stm8s_gpio.h"

 

//lcos driver i2c pin opt

#define LCOS_I2C_SDA_HIGH  GPIO_WriteHigh(GPIOC,GPIO_PIN_7)

#define LCOS_I2C_SDA_LOW   GPIO_WriteLow(GPIOC,GPIO_PIN_7)

#define LCOS_I2C_SCL_HIGH  GPIO_WriteHigh(GPIOC,GPIO_PIN_6)

#define LCOS_I2C_SCL_LOW   GPIO_WriteLow(GPIOC,GPIO_PIN_6)

#define LCOS_I2C_SDA_IN    GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_IN_PU_NO_IT)

#define LCOS_I2C_SDA_OUT   GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_OD_LOW_FAST)

#define LCOS_I2C_SDA_PIN_READ  GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)

 

//LCOS device address

#define LCOS_L_ADDR (0xC8)

#define LCOS_R_ADDR (0xCA)

 

#define LCOS_ACK 1

#define LCOS_NO_ACK 0

 

void LCOS_delay(uint32_t us);

void LCOS_I2C_Start(void);

void LCOS_I2C_Stop(void);

void LCOS_I2C_Ack(void);

void LCOS_I2C_NoAck(void);

uint8_t LCOS_I2C_SendByte(uint8_t data);

uint8_t LCOS_I2C_RecvByte(void);

 

void OP02223_Init(void);

s32 OP02223_I2C_SingleWrite(uint8_t dev_addr,

                             uint16_t reg_addr,

uint8_t data);

s32 OP02223_I2C_BurstWrite(uint8_t dev_addr,

                            uint16_t reg_addr,

uint8_t *data,

uint32_t len);

s32 OP02223_I2C_SingleRead(uint8_t dev_addr,

uint16_t reg_addr,

uint8_t *readData);

s32 OP02223_I2C_BurstRead(uint8_t dev_addr,

uint16_t reg_addr,

uint8_t *readData,

 uint32_t readMaxLen);

源码:


void LCOS_delay(uint32_t us)

{

while(us--);

}

 

void LCOS_I2C_Start(void)

{

LCOS_I2C_SDA_HIGH;

LCOS_delay(5);

LCOS_I2C_SCL_HIGH;

LCOS_delay(5);

LCOS_I2C_SDA_LOW;

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

}

 

void LCOS_I2C_Stop(void)

{

LCOS_I2C_SDA_LOW;

LCOS_delay(5);

LCOS_I2C_SCL_HIGH;

LCOS_delay(5);

LCOS_I2C_SDA_HIGH;

LCOS_delay(5);

}

 

void LCOS_I2C_Ack(void)

{

LCOS_I2C_SDA_LOW;

LCOS_delay(5);

LCOS_I2C_SCL_HIGH;

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

}

 

void LCOS_I2C_NoAck(void)

{

LCOS_I2C_SDA_HIGH;

LCOS_delay(5);

LCOS_I2C_SCL_HIGH;

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

}

 

uint8_t LCOS_I2C_SendByte(uint8_t data)

{

uint8_t status = 0;

uint8_t i = 0;

for (i=0; i < 8; i++)

{

if (data &0x80){

LCOS_I2C_SDA_HIGH;

}

else{

LCOS_I2C_SDA_LOW;

}

LCOS_I2C_SCL_HIGH;

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

data <<=1;

}

   LCOS_I2C_SCL_LOW;

LCOS_delay(5);

LCOS_I2C_SDA_IN;

LCOS_delay(5);

LCOS_I2C_SCL_HIGH;

// LCOS_delay(5);

if (!LCOS_I2C_SDA_PIN_READ){

status = LCOS_ACK;

}

else{

status = LCOS_NO_ACK;

}

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

LCOS_I2C_SDA_OUT;

LCOS_delay(5);

return status;

}

 

uint8_t LCOS_I2C_RecvByte(void)

{

uint8_t i =0;

uint8_t recvData = 0;

//LCOS_I2C_SDA_HIGH;

LCOS_I2C_SDA_IN;

LCOS_delay(5);

for (i=0; i < 8; i++)

{

recvData <<= 1;

LCOS_I2C_SCL_HIGH;

LCOS_delay(2);

if (LCOS_I2C_SDA_PIN_READ){

recvData |= 0x01;

}

// else{

// recvData &= 0xfe;

// }

LCOS_delay(5);

LCOS_I2C_SCL_LOW;

LCOS_delay(5);

}

LCOS_I2C_SDA_OUT;

LCOS_delay(5);

return recvData;

}

 

static void OP02223_SetReg(void)

{

    uint16_t addr = 0;

uint8_t setValue = 0;

volatile s32 i = 0;

for (i = 3; i < sizeof(reg_value);i++)

{

OP02223_I2C_SingleWrite(LCOS_L_ADDR,i,reg_value[i]);

// printf("device_addr:%x,reg_addr:%x,setValue:%x.rn"

//       ,LCOS_L_ADDR,i,reg_value[i]);

// OP02223_I2C_SingleRead(LCOS_L_ADDR,i,&setValue);

// printf("device_addr:%x,reg_addr:%x,setValue:%x.rn"

//       ,LCOS_L_ADDR,i,setValue);

OP02223_I2C_SingleWrite(LCOS_R_ADDR,i,reg_value[i]);

// printf("device_addr:%x,reg_addr:%x,setValue:%x.rn"

//       ,LCOS_R_ADDR,i,reg_value[i]);

// OP02223_I2C_SingleRead(LCOS_R_ADDR,i,&setValue);

// printf("device_addr:%x,reg_addr:%x,setValue:%x.rn"

//       ,LCOS_L_ADDR,i,setValue);

//printf("------------------------------------------------rn");

}

 

 return;

}

 

static void OP02223_Test_Deal(void)

{

 LCOS_delay(200);

GPIO_Init(GPIOC,GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_IN_PU_NO_IT);

 LCOS_delay(200);

}

 

void OP02223_Init(void)

{

GPIO_DeInit(GPIOD); 

   GPIO_DeInit(GPIOC);  

GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//输入

GPIO_Init(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_FAST);

//LCOS_delay(100);

//while (!GPIO_ReadInputPin(GPIOD,GPIO_PIN_3)); //PD3=1

/* while (1)

{

if (GPIO_ReadInputPin(GPIOD,GPIO_PIN_3))

{

break;

}

else

{

 delay(1);

}

}*/

// GPIO_WriteHigh(GPIOC,GPIO_PIN_1);

LCOS_delay(200);

GPIO_WriteLow(GPIOC,GPIO_PIN_1);

GPIO_WriteLow(GPIOC,GPIO_PIN_3);

LCOS_delay(200);

LCOS_I2C_SDA_HIGH;

LCOS_I2C_SCL_HIGH;

LCOS_delay(200);

 

   OP02223_SetReg();

// OP02223_Test_Deal();

}

 

s32 OP02223_I2C_SingleWrite(uint8_t dev_addr,

                             uint16_t reg_addr,

uint8_t data)

{

uint8_t status;

uint32_t i = 0;

   uint8_t buf[4] = {0};

buf[0] = dev_addr;

buf[1] = reg_addr>>8;

buf[2] = (uint8_t)(reg_addr&0xFF);

buf[3] = data;

LCOS_I2C_Start();

for (i = 0; i <4; i++)

{

   status = LCOS_I2C_SendByte(buf[i]);

if (!status)//1error,0ok.

{

// I2C_Stop(LCOS_I2C);

return -1;

}

}

// status = sendByteNoAck(LCOS_I2C,buf[3]);

// status = sendByte(LCOS_I2C,buf[3]);

LCOS_I2C_Stop();

return 0;

}

 

s32 OP02223_I2C_BurstWrite(uint8_t dev_addr,

                            uint16_t reg_addr,

uint8_t *data,

uint32_t len)

{

bool status;

uint32_t i = 0;

   uint8_t buf[3] = {0};

buf[0] = dev_addr;

buf[1] = reg_addr>>8;

buf[2] = (uint8_t)(reg_addr&0xFF);

LCOS_I2C_Start();

for (i = 0; i < 3; i++)

{

   status = LCOS_I2C_SendByte(buf[i]);

if (status)//1error,0ok.

{

return -1;

}

}

for (i = 0; i < len; i++)

{

status = LCOS_I2C_SendByte(data[i]);

if (!status)//1error,0ok.

{

return -1;

}

}

// I2C_NoAck(LCOS_I2C);

LCOS_I2C_Stop();

return 0;

}

 

s32 OP02223_I2C_SingleRead(uint8_t dev_addr,

uint16_t reg_addr,

uint8_t *readData)

{

bool status;

uint32_t i = 0;

   uint8_t buf[3] = {0};

buf[0] = dev_addr;

buf[1] = reg_addr>>8;

buf[2] = (uint8_t)(reg_addr&0xFF);

LCOS_I2C_Start();

for (i = 0; i < 3; i++)

{

   status = LCOS_I2C_SendByte(buf[i]);

if (!status)//1error,0ok.

{

return -1;

}

}

 

LCOS_I2C_Start();//restart i2c

status = LCOS_I2C_SendByte(dev_addr+1);//send read address

if (!status)//1error,0ok.

{

return -1;

}

*readData = LCOS_I2C_RecvByte();

LCOS_I2C_NoAck();

LCOS_I2C_Stop();

return 0;

}

s32 OP02223_I2C_BurstRead(uint8_t dev_addr,

uint16_t reg_addr,

uint8_t *readData,

uint32_t readMaxLen)

{

bool status;

uint32_t i = 0;

   uint8_t buf[3] = {0};

buf[0] = dev_addr;

buf[1] = reg_addr>>8;

buf[2] = (uint8_t)(reg_addr&0xFF);

LCOS_I2C_Start();

for (i = 0; i < 3; i++)

{

   status = LCOS_I2C_SendByte(buf[i]);

if (!status)//1error,0ok.

{

return -1;

}

}

LCOS_I2C_Start();//restart i2c

status = LCOS_I2C_SendByte(dev_addr+1);//send read address

if (status)//1error,0ok.

{

return -1;

}

for (i=0; i {

   *(readData+i) = LCOS_I2C_RecvByte();

LCOS_I2C_Ack();

   }

if (i == readMaxLen-1)

{  

   *(readData+i) = LCOS_I2C_RecvByte();

 LCOS_I2C_NoAck();

   }

LCOS_I2C_Stop();

return 0;

}

相对来说比较简单基础,完毕。


以此开始,记录自己工作中的点滴,加深写作能力。


关键字:stm8s105  调试I2C  AR项目 引用地址:stm8s105调试I2C记录

上一篇:stm8的I2C库的使用
下一篇:STM8硬件I2C配置

推荐阅读

早在上个世纪90年代,日本车企就开始探索混合动力技术,而最早获得成功的品牌便是丰田。在初代普锐斯发布两年后,本田也随即发布了搭载IMA技术的初代Insight。由于当时的市场对混动车不太友好,本田很快放弃了IMA技术的研发,但他们同时也发现了双电机的混动结构相比单电机结构有很大的优势,十年磨一剑的本田也在2012年发布了i-MMD混动技术。而它的出现,...
触摸屏由于其体积小、轻便和接口简单的特点,成为一种在嵌入式系统中应用广泛的输入设备。本实例首先介绍四线电阻式触摸屏的结构和工作原理,然后介绍S3C2440A 通过内部集成的触摸屏控制寄存器的设置,来完成对触摸屏触摸位置坐标的读取。典型触摸屏的工作组件一般由3 部分组成。两层透明的阻性导体层、两层导体之间的隔离层和电极。阻性导体层选用阻性...
在国内芯片设计绿色化、低功耗的发展趋势下,许多公司大力投入进行技术积累。东科半导体是我国主要从事高效绿色电源IC和大功率电源IC设计、生产和销售的企业,其同步整流芯片使用了全球首创的独特“两引脚”封装技术,供电稳定性高,市场竞争优势强。宏单元是集成电路(IC)设计中常见的单元,而硬宏则为特定的功能模块,包括存储器、锁相环PLL等各种IP核,...
据外媒报道,初创公司Point One Navigation开发了用于精确定位的API,可应用于所有类型的车辆,包括城市空中出租车、无人机、小型摩托车、配备ADAS的车辆、自动驾驶汽车,以及农业设备。(图片来源:Point One Navigation)该公司首席执行官兼联合创始人Aaron Nathan表示,“定位是机器人技术需要解决的基础问题之一。每家公司,无论是试图制造机器人...

史海拾趣

问答坊 | AI 解惑

求用测周期法频率计 1~100HZ

求用测周期法频率计 1~100HZ 用AT89S52 单片机 实现 求原理图和源程序 PCB,希望哪位大哥大姐帮帮忙~谢谢!!!!!…

查看全部问答∨

求助 烧写2812 flash

小弟想知道 2812的flash 具体怎么烧写 哪位大哥知道 请指点小弟一下…

查看全部问答∨

安全用电常识(一)

1、 照明开关为何必须接在火线上?   如果将照明开关装设在零线上,虽然断开时电灯也不亮,但灯头的相线仍然是接通的,而人们以为灯不亮,就会错误地认为是处于断电状态。而实际上灯具上各点的对地电压仍是220伏的危险电压。如果灯灭时人们触及 ...…

查看全部问答∨

对于几人收发天线相隔距离很近情况下对电台收信机部分的保护

作者博客:http://radiobcl.blog.163.com/ 在FT-80C等电台的收发切换继电器后面接收输入处加个限幅电路:如果没有合适的两个背对背连接的硅瞬变吸收二极管(TVS),采用几组用二极管1N4148串联的组件正反向并联也可以对地分流,输入串联2W/24V灯泡、 ...…

查看全部问答∨

MOTOROLA 32 位单片机M68300 系列原理与应用

书名:MOTOROLA 32位单片机M68300系列原理与应用 作者:齐秋群主编 出版社:北京理工大学出版社 出版时间:1993 页数:487页 [ 本帖最后由 wzt 于 2010-4-18 22:01 编辑 ]…

查看全部问答∨

232 转485没有信号. 怎么办?

我的232 转485,班子的电压 太低, 正负 5V 板子的电压是  232 正负5v,  出来 连上 232 转 485, 没有信号. 怎么办? 、 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj…

查看全部问答∨

电路基础书籍

《电路基础》第6版这本书好么? 推荐下适合自学电路的入门书籍,最好是国外的书…

查看全部问答∨

关于使用SYMMETRIC_IO_MODE的问题

各位大虾好! 我需要使用APIC,所以在config.h中加入了定义“#deinfe SYMMETRIC_IO_MODE“,但修改完以后,系统启动刚过V1.6+++++++++这个画面就蓝屏了,再没有任何改变。 我用的是pentium M处理器,vxworks5.5.1和tornado2.2.在该这个之前,一切 ...…

查看全部问答∨

系统运行到FMD::FMD_Init就停止了,求救!!

最近在弄S3C2410上的利用剩余FLASH永久保存的问题,我 PB是CE4.2,工作流程如下,先在定植内核的时候把HIVE悬赏,然后改platform.reg文件,改动如下: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars]     "SYSTEMHIVE"="s ...…

查看全部问答∨

推荐工作

最近真的要换工作了,各位同行能推荐一下吗。 1. 做了5年多智能手机项目,主要是Windows Mobile,PXA270平台,Nucluse 和MTK 6226也做过。 2. 想找个在深圳的公司,最好能做 Windows Mobile 或 WinCE 手机的。 3. 对Windows Mobile 的 MMI 开发以 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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