av无码国产在线看岛国_日韩精品无码专区国产av影院_在线主播精品国产99热_国模无码一区二区久久_97影院九七理论片男女高清_中文字幕一级毛片_亚洲国产av无码专区亚洲av_成人黄色小说在线观看_H动漫无遮挡在线看中文_国产午夜精品理论片免费视频播放

您好,歡迎訪問上?,F(xiàn)易電子元器件有限公司網(wǎng)站!

021-51870898
021-51870898   18019251567
4新聞資訊
您的位置: 首頁 ->  新聞資訊 -> 單片機

?STM8S 模擬I2C程序

文章出處:單片機 責(zé)任編輯:上?,F(xiàn)易電子元器件有限公司 發(fā)表時間:2018-05-20

STM8S的硬件I2C還是存在問題,不敢貿(mào)然使用.

#define SCL PE_ODR_ODR1
#define SDA PE_ODR_ODR2
#define SDAM PE_IDR_IDR2
#define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}
#define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}
#define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;}
//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Description : Start Singnal
//--------------------------------------------------------------
void I2C_Init(void)
{
I2C_CR1 &= 0xFE; // PE=0, disable I2C module 
SET_SCL_OUT();
SET_SDA_OUT(); 
}

//--------------------------------------------------------------
// Prototype : void Delay_5us(void)
// Description : 大約延時5us
//--------------------------------------------------------------
void Delay_5us(void)
{
uchar i; //fcpu 8MHz 時
for (i=50; i>0; i--);
}

//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Description : Start Singnal
//--------------------------------------------------------------
void I2C_Start(void)
{
// SDA 1->0 while SCL High
SDA = 1; 
SCL = 1; 
Delay_5us(); 
SDA = 0; 
Delay_5us(); 
SCL = 0; 
}

//--------------------------------------------------------------
// Prototype : void I2C_Stop(void)
// Calls : Delay_5us()
// Description : Stop Singnal
//-------------------------------------------------------------- 
void I2C_Stop(void)
{
// SDA 0->1 while SCL High
SDA = 0; 
SCL = 1; 
Delay_5us(); 
SDA = 1; 
Delay_5us(); 
}
//--------------------------------------------------------------
// Prototype : void I2C_SendACK(uchar ack);
// Calls : Delay_5us()
// Parameters : bit ack:1-noack, 0-ack
// Description : Master device send ACK to slave device.
//--------------------------------------------------------------
void I2C_SendACK(uchar ack)
{
if(ack == 0)
{
SDA = 0; 

else
{
SDA = 1; 
}

SCL = 1; 
Delay_5us(); 

SCL = 0; 
Delay_5us(); 
}
//--------------------------------------------------------------
// Prototype : uchar I2C_SendByte(uchar sendDAT)
// Calls : Delay_5us()
// Parameters : uchar sendDAT---data to be send
// Return Value : CY--slave ack (1---noack,0---ack)
// Description : Send one byte to I2C
//--------------------------------------------------------------
uchar I2C_SendByte(uchar sendDAT)
{
uchar i,revack;
for (i= 0 ; i< 8; i++) 
{
SCL = 0; 
Delay_5us(); 
if (sendDAT & 0x80) // write data
{
SDA = 1;
}
else 
{
SDA = 0;
}
sendDAT <<= 1;
SCL = 1; 
Delay_5us(); 


SCL = 0; 
Delay_5us(); 

SET_SDA_IN();

SCL = 1; 
asm("nop");
asm("nop");

revack = (uchar)SDAM;

Delay_5us(); 
SCL = 0; 

SET_SDA_OUT();

Delay_5us(); 
return revack;
}

//--------------------------------------------------------------
// Prototype : uchar I2C_RecvByte()
// Calls : Delay_5us()
// Parameters : none
// Return Value : revDAT- received data
// Description : Receive one byte from I2C
//--------------------------------------------------------------
uchar I2C_RecvByte()
{
uchar i;
uchar revDAT = 0;

SDA = 1; // latch the Data port befor reading

SET_SDA_IN();

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

revDAT <<= 1;

SCL = 1; 

asm("nop");
asm("nop");

if (SDAM)
{
revDAT |= 0x01;
}
else
{
revDAT &= 0xfe;
}
Delay_5us(); 
SCL = 0; 
Delay_5us(); 
}

SET_SDA_OUT();

return revDAT;
}

//--------------------------------------------------------------
// Prototype : void Write_PT2314(uchar wdata)
// Calls : I2C_Start(), I2C_Stop(),I2C_SendByte()
// Parameters : RegAddr-- target memory address, 
// wrdata--- data to be writing
// Description : Write one byte to target memory
//--------------------------------------------------------------
void Write_24c02(uchar regadd,uchar wdata)
{
I2C_Start(); 
I2C_SendByte(0xA0); // Device Addr + Write (operation) 
I2C_SendByte(regadd); 
I2C_SendByte(wdata); 
I2C_Stop(); 
}
uchar Read_24c02(uchar regadd)
{
uchar revdata;

I2C_Start(); 
I2C_SendByte(0xA0); // Device Addr + Write (operation) 
I2C_SendByte(regadd); 

I2C_Start(); 
I2C_SendByte(0xA1); // Device Addr + Write (operation) 

revdata = I2C_RecvByte(); 
I2C_SendACK(1);

I2C_Stop(); 

return revdata;
}


上海現(xiàn)易電子元器件有限公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

CopyRight 2020-2025 29711999.com.cn All rights reserved   滬ICP備2020031792號

電話

易經(jīng)理

18019251567

微信

易經(jīng)理

易經(jīng)理

頂部

咨詢