<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

STM8S105S4 I2C

作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò ) 收藏
STM8S105S4 I2C這樣配置可以從機發(fā)數據,從機接數據就不行,是什么問(wèn)題
//I2C端口初始化
GPIO_Init(GPIOE,GPIO_PIN_1|GPIO_PIN_2, GPIO_MODE_OUT_OD_HIZ_SLOW);
void I2C_init(void)
{
I2C_CCRH = 0; //標準I2C接口
I2C_CCRL = 80 ;
I2C_FREQR = 16;
I2C_OARL = (I2CAddr<<1);
I2C_OARH= 0x40;
I2C_ITR =0x06;
I2C_CR1 =0x01;
I2C_CR2 |=0x04;
}
@far @interrupt void I2C_Handler (void)
{
u8 state1,state2,state3;
state1 = I2C_SR1;
state2 = I2C_SR2;
state3 = I2C_SR3;
//地址匹配
if((state1&0x02)!=0){I2C_CR2 |= 0x04;}
//接收到數據,需要處理
if( (state1& 0x40) != 0)
{
I2C_CR2|= 0x04;
temp1= I2C_DR;
SetOutput(temp1);
}
//從機需要發(fā)送數據
if((state1 & 0x80) != 0)
{
I2C_DR = num++;
}
if((state2 & 0x04) != 0)I2C_SR2 &= ~0x04; //應答失敗,清除該位
if((state1 & 0x10) != 0)
{
I2C_CR2 = 0x02;
}
}
我寫(xiě)成這樣子,發(fā)現現在是從機發(fā)數據是沒(méi)問(wèn)題,從機接收數據不行,沒(méi)有進(jìn)入中斷。

成功傳輸一次正確的數據后就進(jìn)不去了。程序還正常運行

本文引用地址:http://dyxdggzs.com/article/201612/325048.htm

#define I2CAddr 0x01
在主機
//主機寫(xiě)數據,從機接,這個(gè)不行
Soft_I2C_Start();
Soft_I2C_Write(0x02);
Soft_I2C_Write(0xAA);
Soft_I2C_Stop();
//主機接收數據。沒(méi)有運行上一段程序,主機可以接收數據,運行上段,主機接收數據都是255
Soft_I2C_Start();
Soft_I2C_Write(0x03);
var0=Soft_I2C_Read(1);
Soft_I2C_Stop();
這個(gè)軟I2C在控制其它設備是沒(méi)有問(wèn)題的,主機用的芯片是STM32。應該是沒(méi)有問(wèn)題的

解決問(wèn)題:

這就是了,你第一次成功后了,你把應答給關(guān)掉了,還怎么接收啊。。。以后配寄存器要多一個(gè)心眼才是。

問(wèn)題就在這里I2C_CR2 = 0x02; 修改為I2C_CR2 |= 0x02;原因是修改了,第一次成功后,沒(méi)有再回復

1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
2.必須連接硬件
3.總線(xiàn)不能busy,一定要空閑
初始化代碼如下:
GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Slow);
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
I2C_Init(I2C1, 50000, 0xA5, I2C_Mode_I2C, I2C_DutyCycle_2,
I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
//注:I2C_Init()里已經(jīng)使能了I2C,所以可以不用I2C_Cmd(I2C1, ENABLE);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

stm8 自帶I2C終于調試成功。

1,此次調試I2C受益多多,首先證明官方的那個(gè)寫(xiě)EEPROM的程序是對的。
2,這次調試TW8816開(kāi)始調不通的原因是誤以為寄存器地址是16位的(芯片公司的業(yè)務(wù)也是這么說(shuō)的,我相信了),才讓我看到的數據不同,但我想,有數據了,而且用WHILE等待的方法,程序跑通了,說(shuō)明連上了從機。
3, I2C的GPIO不要配置,我看到有些同仁把GPIO配置了。
4,為了大家用好STM8的I2C,我把程序烤下來(lái)。

void IIC_Init(void)
{
UCHAR temp;

CLK_PCKENR1 |= 0x01;

I2C_FREQR |= 0x10; //輸入外設時(shí)鐘頻率為1MHz
I2C_CR1 = 0x00; //禁止I2C外設
I2C_CCRH&= ~0xcf;
I2C_CCRL&= ~0xff;
I2C_TRISER = 0x11;
I2C_CCRL = 0x10;
I2C_CCRH = 0x00;
I2C_CR1 |= 0x01; //開(kāi)啟I2C外設
I2C_CR2 |= 0x04; //當前接收字節返回應答
I2C_CR2 &= 0x08;
I2C_OARL = 0x86; //自身地址
I2C_OARH = 0x40;
}

void Read_8816(UCHAR *pBuffer, UCHAR index, UCHAR NumByteToRead)
{
UCHAR temp;

while(I2C_SR3 & 0x02); //等待總線(xiàn)空閑
I2C_CR2 |= 0x01; //產(chǎn)生起始位
while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完
I2C_DR = 0x8a; //發(fā)送8816器件地址
while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
temp = I2C_SR1;
temp = I2C_SR3;
I2C_DR = (UCHAR)(index);
while(!(I2C_SR1 & 0x84));

I2C_CR2 |= 0x01; //產(chǎn)生重復起始位
while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完
I2C_DR = 0x8b; //讀
while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
temp = I2C_SR1;
temp = I2C_SR3;
while(NumByteToRead) //要讀幾個(gè)字節
{
if(NumByteToRead == 1)
{
I2C_CR2 &= ~0x04; //不返回應答
I2C_CR2 |= 0x02; //產(chǎn)生停止位
}
if(I2C_SR1 & 0x40)
{
temp = I2C_SR1;
Buff[8-NumByteToRead]=I2C_DR;
*pBuffer = Buff[8-NumByteToRead];
pBuffer++;
NumByteToRead--;
}
}
I2C_CR2 |= 0x04;
I2C_CR2 &= ~0x08; //為下一次接收使能應答
}



關(guān)鍵詞: STM8S105S4I2

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>