最近由于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; } 相对来说比较简单基础,完毕。 以此开始,记录自己工作中的点滴,加深写作能力。
上一篇:stm8的I2C库的使用
下一篇:STM8硬件I2C配置
推荐阅读
史海拾趣
在电子行业的早期,Bestar Electric公司应运而生。作为一家初创企业,公司凭借对技术的深刻理解和市场需求的敏锐洞察,专注于电子元器件的研发与生产。通过不断的技术创新和产品优化,Bestar Electric逐渐在行业内建立起良好的声誉,并获得了初步的市场份额。
随着业务的不断发展,Elekon开始寻求更广阔的市场空间。公司制定了全球化战略,积极开拓国际市场。通过参加国际展会、建立海外销售网络等方式,Elekon成功将产品打入国际市场,并赢得了众多客户的青睐。同时,Elekon还与国际知名电子企业建立了合作关系,共同研发新产品、开拓新市场。
格瑞宝公司成立于2014年8月,总部选址于上海张江高科园,这里是中国科技创新的重要基地之一。公司从创立之初就明确了以自主研发、销售服务为主体的半导体公司发展路径。这一决策不仅为格瑞宝提供了丰富的科技资源和人才支持,也为其后续快速发展奠定了坚实基础。在总部的带领下,格瑞宝逐步建立起完善的产品研发、设计、测试和销售体系。
诚润电子(CHEVRON)自创立之初,就以技术为核心竞争力。公司在2010年正式成立,由一群热衷于电子保护元件研发的工程师创立。他们深知,在这个日新月异的电子行业中,只有不断创新,才能在竞争中立于不败之地。因此,诚润电子从一开始就专注于电子保护元件的研发和生产,通过不断的技术创新,逐渐在市场中树立起了自己的品牌。
Component General Inc公司的创立,标志着电子行业中一颗新星的升起。自XXXX年成立以来,公司始终致力于射频/微波设计领域的研发与生产。起初,公司只有几名创始人和一些基础的研发设备,但他们凭借着对技术的热情和执着,成功地开发出了首款高功率电阻器,这为公司后续的发展奠定了坚实的基础。
Comtech AHA Corp在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Comtech AHA Corp还积极参与社会公益事业,为社会发展贡献自己的力量。这种负责任的企业形象赢得了社会各界的广泛赞誉和支持。
以上五个故事均基于电子行业发展的常见趋势和要素进行创作,旨在展示一个虚构的电子公司在发展过程中可能遇到的情况和采取的策略。请注意,这些故事并不涉及任何真实公司的历史或经营情况。
作者博客: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,班子的电压 太低, 正负 5V 板子的电压是 232 正负5v, 出来 连上 232 转 485, 没有信号. 怎么办? 、 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj… 查看全部问答∨ |
各位大虾好! 我需要使用APIC,所以在config.h中加入了定义“#deinfe SYMMETRIC_IO_MODE“,但修改完以后,系统启动刚过V1.6+++++++++这个画面就蓝屏了,再没有任何改变。 我用的是pentium M处理器,vxworks5.5.1和tornado2.2.在该这个之前,一切 ...… 查看全部问答∨ |
|
最近在弄S3C2410上的利用剩余FLASH永久保存的问题,我 PB是CE4.2,工作流程如下,先在定植内核的时候把HIVE悬赏,然后改platform.reg文件,改动如下: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars] "SYSTEMHIVE"="s ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 【MPS有奖分享】便携式多功能电工台的核“芯”功能测试与结构设计
- 学知识,赢好礼|泰克半导体材料与器件测试技术电源特性篇!
- 有奖直播|保护嵌入式设备与系统的完整性和可靠性——英飞凌 OPTIGA™ TPM 安全解决方案
- Microchip最新SAM 以及 PIC32单片机软件开发平台-- MPLAB® Harmony V3介绍 ”
- 2024 DigiKey 应用说:树莓派 5 在视频直播中的应用
- 揭Altera MAX10神秘面纱,下载白皮书,抢楼赢好礼!
- 看视频赢京东卡 | 泰享实测之水哥秘籍
- 【免费申请】英飞凌PSoC 62S4 先锋套件 (CY8CKIT-062S4)
- 全球首款Cortex-M23内核物联网芯片SAML10和SAM L11系列 闯关获取SAML10/SAML11法宝,拆除电子界安全危机,赢好礼!
- 直播已结束【安森美半导体超低功耗 RSL10 蓝牙 SoC 开发板详解】