专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
求助,因为项目用stm32f030f4芯片控制wm8950芯片,然后怎么配置都配置不出来ADCDAT数据,在这请教下,有人知道怎么弄么?
2019-08-22 14:16
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
1810
6
1508
stm32跟wm8950通信是,采用两线控制方式,然后IIC是用模拟IIC的方式,然后配置了好多东西都不见ADCDAT有数据产生,请求大神指点下。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
LSP
2019-08-22 23:21
我这边贴下,我写的程序
//-------------------------------------------------------------------------------------
#define DevAddr 0x34 //0011 0100
//初始化IIC
static void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitA;
//开PA时钟
RCC->AHBENR |= (0X1<<17);
GPIO_InitA.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitA.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitA.GPIO_OType = GPIO_OType_PP;//推挽
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitA);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
static void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitA;
GPIO_InitA.GPIO_Pin = GPIO_Pin_3;
GPIO_InitA.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitA.GPIO_OType = GPIO_OType_PP;//推挽
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitA);
}
static void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitA;
GPIO_InitA.GPIO_Pin = GPIO_Pin_3;
GPIO_InitA.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitA);
}
//产生IIC起始信号
static void IIC_Start(void)
{
SDA_OUT(); //sda线输出
SDA_1();
CLK_1();
Delay_us(1);
SDA_0();//START:when CLK is high,DATA change form high to low
Delay_us(1);
CLK_0();//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
static void IIC_Stop(void)
{
SDA_OUT();//sda线输出
SDA_0();
CLK_0();//STOP:when CLK is high DATA change form low to high
Delay_us(1);
SDA_1();
CLK_1();//发送I2C总线结束信号
Delay_us(1);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
static u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
CLK_1();Delay_us(1);
while(GPIOA->IDR & (0X1<<3))
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
CLK_0();//时钟输出0
return 0;
}
//产生ACK应答
static void IIC_Ack(void)
{
CLK_0();
SDA_OUT();
SDA_0();
Delay_us(1);
CLK_1();
Delay_us(1);
CLK_0();
}
//不产生ACK应答
static void IIC_NAck(void)
{
CLK_0();
SDA_OUT();
SDA_1();
Delay_us(1);
CLK_1();
Delay_us(1);
CLK_0();
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
static void IIC_Send_Byte(u8 txd)
{
u8 t, DATA;
SDA_OUT();
CLK_0();//拉低时钟开始数据传输
for (t=0;t<8;t++)
{
DATA=(txd&0x80)>>7;
if(DATA)
{
SDA_1();
}
else
{
SDA_0();
}
txd<<=1;
Delay_us(1); //对TEA5767这三个延时都是必须的
CLK_1();
Delay_us(1);
CLK_0();
Delay_us(1);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
static u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for (i=0;i<8;i++ )
{
CLK_0();
Delay_us(1);
CLK_1();
receive<<=1;
if(GPIOA->IDR & (0X1<<3))receive++;
Delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
//------------------------ AT24C02 一次8位 ------------------------------------------
//初始化IIC接口
void WM8950_Init(void)
{
IIC_Init();
WM8950_WriteOneByte(0x00, 0x000);
//AUXEN-6, MICEN-4,PLLEN-5,BIASEN-3,1111101
Delay_ms(10);
WM8950_WriteOneByte(0x01, 0x07D);
Delay_ms(10);
WM8950_WriteOneByte(0x02, 0x015);
Delay_ms(10);
// //设置R6 bit0=1 1=BCLK and FRAME clock are outputs
// // bit8=0 时钟源=MCLK
// WM8950_WriteOneByte(0x06, 0x032);
Delay_ms(10);
}
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void WM8950_WriteOneByte(u8 WriteAddr,u16 DataToWrite)
{
u8 Write_bit8;
Write_bit8 <<= 1;
Write_bit8 |= (DataToWrite&0x100)>>8; //芯片是七位寄存器地址和一个数据的B8位
IIC_Start();
IIC_Send_Byte(DevAddr); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(Write_bit8);//发送高地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite*0xff); //发送字节 低八位数据
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
Delay_ms(10); //EEPROM的写入速度比较慢,加入延迟
}
//WriteAddr :开始写入的地址
//pBuffer :数据数组首地址
//NumToWrite:要写入数据的个数
void WM8950_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
while(NumToWrite--)
{
WM8950_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}
加载中...
查看其它6个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//-------------------------------------------------------------------------------------
#define DevAddr 0x34 //0011 0100
//初始化IIC
static void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitA;
//开PA时钟
RCC->AHBENR |= (0X1<<17);
GPIO_InitA.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitA.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitA.GPIO_OType = GPIO_OType_PP;//推挽
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitA);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
static void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitA;
GPIO_InitA.GPIO_Pin = GPIO_Pin_3;
GPIO_InitA.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitA.GPIO_OType = GPIO_OType_PP;//推挽
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitA);
}
static void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitA;
GPIO_InitA.GPIO_Pin = GPIO_Pin_3;
GPIO_InitA.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitA.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitA);
}
//产生IIC起始信号
static void IIC_Start(void)
{
SDA_OUT(); //sda线输出
SDA_1();
CLK_1();
Delay_us(1);
SDA_0();//START:when CLK is high,DATA change form high to low
Delay_us(1);
CLK_0();//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
static void IIC_Stop(void)
{
SDA_OUT();//sda线输出
SDA_0();
CLK_0();//STOP:when CLK is high DATA change form low to high
Delay_us(1);
SDA_1();
CLK_1();//发送I2C总线结束信号
Delay_us(1);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
static u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
CLK_1();Delay_us(1);
while(GPIOA->IDR & (0X1<<3))
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
CLK_0();//时钟输出0
return 0;
}
//产生ACK应答
static void IIC_Ack(void)
{
CLK_0();
SDA_OUT();
SDA_0();
Delay_us(1);
CLK_1();
Delay_us(1);
CLK_0();
}
//不产生ACK应答
static void IIC_NAck(void)
{
CLK_0();
SDA_OUT();
SDA_1();
Delay_us(1);
CLK_1();
Delay_us(1);
CLK_0();
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
static void IIC_Send_Byte(u8 txd)
{
u8 t, DATA;
SDA_OUT();
CLK_0();//拉低时钟开始数据传输
for (t=0;t<8;t++)
{
DATA=(txd&0x80)>>7;
if(DATA)
{
SDA_1();
}
else
{
SDA_0();
}
txd<<=1;
Delay_us(1); //对TEA5767这三个延时都是必须的
CLK_1();
Delay_us(1);
CLK_0();
Delay_us(1);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
static u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for (i=0;i<8;i++ )
{
CLK_0();
Delay_us(1);
CLK_1();
receive<<=1;
if(GPIOA->IDR & (0X1<<3))receive++;
Delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
//------------------------ AT24C02 一次8位 ------------------------------------------
//初始化IIC接口
void WM8950_Init(void)
{
IIC_Init();
WM8950_WriteOneByte(0x00, 0x000);
//AUXEN-6, MICEN-4,PLLEN-5,BIASEN-3,1111101
Delay_ms(10);
WM8950_WriteOneByte(0x01, 0x07D);
Delay_ms(10);
WM8950_WriteOneByte(0x02, 0x015);
Delay_ms(10);
// //设置R6 bit0=1 1=BCLK and FRAME clock are outputs
// // bit8=0 时钟源=MCLK
// WM8950_WriteOneByte(0x06, 0x032);
Delay_ms(10);
}
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void WM8950_WriteOneByte(u8 WriteAddr,u16 DataToWrite)
{
u8 Write_bit8;
Write_bit8 <<= 1;
Write_bit8 |= (DataToWrite&0x100)>>8; //芯片是七位寄存器地址和一个数据的B8位
IIC_Start();
IIC_Send_Byte(DevAddr); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(Write_bit8);//发送高地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite*0xff); //发送字节 低八位数据
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
Delay_ms(10); //EEPROM的写入速度比较慢,加入延迟
}
//WriteAddr :开始写入的地址
//pBuffer :数据数组首地址
//NumToWrite:要写入数据的个数
void WM8950_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
while(NumToWrite--)
{
WM8950_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}
一周热门 更多>