历史上的今天
今天是:2024年11月11日(星期一)
2019年11月11日 | STM8 I2C从机
2019-11-11 来源:eefocus
宏定义
#define SLAVE_ADDR 0x51
#define I2CSPEED 400000 //i2c速度
stm8l051 i2c从机初始化
/* I2C clock Enable*/
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
I2C_DeInit(I2C1);
I2C_Init(I2C1, I2CSPEED, SLAVE_ADDR ,
I2C_Mode_I2C, I2C_DutyCycle_2,
I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
/* Enable Error Interrupt*/
I2C_ITConfig(I2C1, (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
stm8s103 i2c从机初始化
I2C_Init(I2CSPEED, SLAVE_ADDR , I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, I2CCLK);//I2C初始化
I2C_ITConfig(I2C1, (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
中断处理
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//接收发送
Uchar temp = 0;
if (I2C1->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)
{
temp = I2C1->SR3&0x07;
}
else if ((I2C1->SR1&0x84)&&(I2C1->SR3&0x04))//数据字节传送完
{
temp = 0xA5; //假设这里发送0xA5
I2C1->DR = temp;
}
else if ((I2C1->SR1&0x40)&&(0 == (I2C1->SR3&0x04)))//接收时数据寄存器
{
temp = I2C1->DR; //读取数据寄存器
}
else if (I2C1->SR1&0x10)//检测到停止位
{
I2C1->CR2 = I2C1->CR2;//清除停止位
}
//错误处理
if (I2C1->SR2&0x01)//总线错误
{
I2C1->SR2 &= ~0x01;//清零
}
else if(I2C1->SR2&0x02)//仲裁失败
{
I2C1->SR2 &= ~0x02;//清零
}
else if(I2C1->SR2&0x04)//应答失败
{
I2C1->SR2 &= ~0x04;//清零
}
else if(I2C1->SR2&0x08)//上溢、下溢
{
I2C1->SR2 &= ~0x08;//清零
}
return;
}
以上程序已长时间测试未发生过任何异常,所以他们说stm8的I2C存在硬件BUG应该是谣言。
史海拾趣
|
如何用程序控制I/O口使得输出低电平以开启SIM300模块? 各位大虾: 今遇到一棘手问题:程序在使用SIM300模块进行通信的时候,发现SIM300模块开启的时候需要给它的PWRKEY引脚供低电平2秒钟,我怎么写程序能控制PWRKEY引脚呢?我用的是2440,硬件的连接我不清楚,但我估计应该是使用通用I/O ...… 查看全部问答> |
|
我使用的是SIM300C模块,用三线的简单串口与S3C2410连接。 现在网络是通上了,也能正常与服务器端进行发送接收! 当我向SIM300C发送命令的时候,他会反馈一些字符信息。 问题是当我正在向SIM300C发送命令、数据的时候,服务器端下发的数据也从串 ...… 查看全部问答> |
|
看门狗驱动程序 程序部分: PHYSICAL_ADDRESS RegPA; if (v_pWTDregs == NULL) { RegPA.QuadPart = WDTIM_BASE; v_pWTDregs = (volatile WDT_REGS_T *)MmM ...… 查看全部问答> |
|
#include \"msp430g2553.h\"unsigned char num;void main(){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; BCSCTL ...… 查看全部问答> |
|
/home/wq/linux_drv/int_key/int_key_drv.c:69: warning: initialization from incompatible pointer type /home/wq/linux_drv/int_key/int_key_drv.c:72:25: error: macro \"key_init\" passed 1 arguments, but takes just 0 /home/wq/linux_dr ...… 查看全部问答> |




