- 2024-04-29
-
发表了主题帖:
STC98LE52模拟 I2C通信 这个波形为什么会出现中间的电平,怎么消除?
STC98LE52模拟 I2C通信 带1个负载,上拉电阻是R202,这个波形为什么会出现中间的电平,怎么消除啊?求帮助
图后附模拟I2C程序
//状态标志
bit ack; //应答标志位
void Delay50us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 22;
while (--i);
}
// 起动总线函数
//函数原型: void Start_I2c();
//功能: 启动I2C总线,即发送I2C起始条件.
void start_i2c()
{
sda=1; //发送起始条件的数据信号
sck=1;
Delay50us();
sda=0; //发送起始信号
Delay50us();
sck=0; //钳住I2C总线,准备发送或接收数据
Delay50us();
}
// 结束总线函数
//函数原型: void Stop_I2c();
//功能: 结束I2C总线,即发送I2C结束条件.
void stop_i2c()
{
sda=0; //发送结束条件的数据信号
sck=1; //结束条件建立时间大于4μs
Delay50us();
sda=1; //发送I2C总线结束信号
Delay50us();
}
// 字节数据传送函数
//函数原型: void SendByte(unsigned char c);
//功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
// 此状态位进行操作.(不应答或非应答都使ack=0 假)
// 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
void sendbyte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)sda=1; //判断发送位
else sda=0;
sck=1; //置时钟线为高,通知被控器开始接收数据位
Delay50us();
sck=0;
}
Delay50us();
sda=1; //8位发送完后释放数据线,准备接收应答位
Delay50us();
sck=1;
Delay50us();
if(sda==1)ack=0;
else ack=1; //判断是否接收到应答信号
sck=0;
Delay50us();
}
- 2024-04-09
-
回复了主题帖:
STM32F103单使用串口收发时,收不到数据,SR寄存器的LBD,FE置位,NE没有置位
秦天qintian0303 发表于 2024-4-9 11:21
波特率111111,你的串口助手可以设置这个值吗?
可以设置,使用SSCOM,可以自定义设置波特率,我也用波特率9600试过,也是上面这种情况
-
回复了主题帖:
STM32F103单使用串口收发时,收不到数据,SR寄存器的LBD,FE置位,NE没有置位
没事用LIN为什么会检测到断开呢,还FE置位NE没有置位那表示没有发生帧错误而是接受到断开符,我用CH341的TX和RX短接,串口助手收发都正常,没问题,难道是我硬件有问题?
-
发表了主题帖:
STM32F103单使用串口收发时,收不到数据,SR寄存器的LBD,FE置位,NE没有置位
本帖最后由 CC2503 于 2024-4-9 10:36 编辑
求助:STM32F103单使用串口收发时,收不到数据,SR寄存器的LBD:LIN断开标志,RXNE读数据寄存器非空,IDLE监测到总线空闲,FE帧错误以上均被硬件置位,NE没有置位,接收到的数据一直为0,找不到原因了。
使用的USART1 RX PA0浮空输入,TX PA9复用推挽输出 速度10M,系统时钟16M 波特率111111,串口收发使用的CH341 12M,整个系统只是使用了串口收发一个功能。
以下为DEBUG:
初始化后USART1各寄存器状态
收到收据后SR寄存器状态
发送数据后SR寄存器状态
USART1部分代码如下:
void USART1_Conf(void)
{
USART1->CR1 &= ~USART_CR1_M;//一个起始位,8个数据位,n个停止位
USART1->CR2 &= ~USART_CR2_STOP;//设置1个停止位
USART1->BRR &= ~USART_BRR_DIV_Mantissa;//整数部分清0
USART1->BRR |= (9<<4);//设置整数部分 9 整数加小数部分为9.0000
USART1->BRR &= ~USART_BRR_DIV_Fraction;//小数部分清0
USART1->CR1 |= USART_CR1_UE;//USART1使能
USART1->CR1 |= USART_CR1_RE;//使能接收
USART1->CR1 &= ~USART_CR1_RWU;//接收器处于正常工作模式
}
int main(void)
{
unsigned long u;
RCC_Conf();
GPIO_Conf();
USART1_Conf();
while(1)
{
while(!(USART1->SR & USART_SR_RXNE));//等待收到数据可以读出
u=USART1->DR;
USART1->CR1 |= USART_CR1_TE;//使能发送
while(!(USART1->SR & USART_SR_TC));//等待发送完成
while(!(USART1->SR & USART_SR_TXE));//等待发送数据寄存器空
USART1->DR =u;//数据写进DR发送寄存器中
while(!(USART1->SR & USART_SR_TC));//等待发送完成
while(!(USART1->SR & USART_SR_TXE));//等待发送数据寄存器空
USART1->CR1 &= ~USART_CR1_TE;//关闭发送
}
}
- 2024-04-01
-
回复了主题帖:
新编电子电路大全 共3卷
感谢分享,对基础学习很有帮助,多看一看受益颇深
-
回复了主题帖:
《晶体管电路设计》日本 池原典利著 中文版
感谢分享,参考借鉴以下,对基础学习很有帮助,大好人
- 2024-03-05
-
回复了主题帖:
Analog Circuit Design.pdf
谢谢楼主分享
- 2024-03-04
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
captz 发表于 2024-3-4 10:28
加二极管和电容的确是对症下药!与电源、PWM串联的二极管参数也要考虑,因为关系内阻。
我把这个用在给液晶的升压端口供电上,负载阻抗很大对电压需求大对电流需求小,在使用上没什么影响。如果负载阻抗小的话就必须考虑你说的这个了,电流需求大的电路用这个供电会不稳定吧,电流的波纹应该挺大的而且不好消,多级升压之后能对负载提供的电流会更小。
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
zhaoyanhao 发表于 2024-3-4 09:57
这个电路干嘛用了,是想在PWM波上加个偏置吗
自举升压电路,靠PWM把电容阳极端电压推上去,通过电容级联可以推到相当高的量级,可以用在液晶显示的升压供电上,对电流需求不大的电路差不多都可以用
- 2024-03-01
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
lkh747566933 发表于 2024-3-1 14:02
应该是有负载就这样,把负载断开。实际应用的话增加跟随电路。
跟随电路也会避不开这个掉电压,上面的回复是加一个二极管和电容,解决了这个问题
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
maychang 发表于 2024-3-1 13:19
增加的电容与电阻并联,增加的二极管正极在A点,负极在电阻上端,原A点到电阻上端的联接线开路。
已经实现,太感谢了!!复盘了一下后加的那个电容起到续流的作用,二极管保证电流向负载方向流动。
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
maychang 发表于 2024-3-1 12:51
【第一个问题:A点的电压下降是不是无法消除啊】
减小这点的电压下降,只能尽量减小Uin电源的内阻和PWM ...
感谢
-
回复了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
不亦心 发表于 2024-3-1 12:58
再加个二极管和电容
加到什么位置呢?和电阻并联上么
-
发表了主题帖:
由二极管和电容组成的电容自举电路,由PWM下降沿产生的自举电压下降是不是消除不了?
自举电路图
由PWM下降沿产生的A点电压下降
这个A点的波形是不是无法消除啊,尝试过在电阻RL两端并一个C105电容,发现会把PWM给滤掉,换了一个小的C103并在电阻两端,依旧无法消除。
第一个问题:A点的电压下降是不是无法消除啊
第二个问题:带负载能力相当的弱,这个电路实际中有什么用啊?