专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
谁能给我个PT2315的完整程序
2020-01-17 19:04
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
5528
3
3
最近我在做PT2315音量音调控制程序(STA12C5A60S2)c语言编程,可怎么也不能通过I2C向PT2315写入控制数据,跪求赐教啊??十分感谢!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
cemi
2020-01-17 22:55
给你一个PT2312的程序, 这个程序在实际电路中使用没有问题的
//#include <stm32f10x_lib.h>
#include "PT2312.h"
/********************************************************/
//extern void Systick_Delay_1ms(u32 nCount);
//static u8 Globe_Volume;
static u8 Origin_FL, Origin_FR, Origin_RL, Origin_RR;
void PT2312_I2C_delay(void)
{
u8 i = 50; //这里可以优化速度 ,经测试最低到5还能写入
while(i)
{
i--;
}
}
bool PT2312_I2C_Start(void)
{
PT2312_SDA_H;
PT2312_SCL_H;
PT2312_I2C_delay();
if(!PT2312_SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
PT2312_SDA_L;
PT2312_I2C_delay();
if(PT2312_SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
PT2312_SDA_L;
PT2312_I2C_delay();
return TRUE;
}
void PT2312_I2C_Stop(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_L;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
}
void PT2312_I2C_Ack(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_L;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SCL_L;
PT2312_I2C_delay();
}
void PT2312_I2C_NoAck(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SCL_L;
PT2312_I2C_delay();
}
bool PT2312_I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
if(PT2312_SDA_read)
{
PT2312_SCL_L;
PT2312_I2C_delay();
return FALSE;
}
PT2312_SCL_L;
PT2312_I2C_delay();
return TRUE;
}
void PT2312_SendByte(u8 SendByte) //数据从高位到低位//
{
u8 i=8;
while(i--)
{
PT2312_SCL_L;
PT2312_I2C_delay();
if(SendByte&0x80)
{ PT2312_SDA_H; }
else
{ PT2312_SDA_L; }
SendByte<<=1;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
}
PT2312_SCL_L;
}
void SetVolume(u8 Value)
{
if (Value > 63) Value = 63;
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Value & 0x3F);//0
if (PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void Mute(u8 MuteSound) //MuteSound = 1 Mute the sound
{
/* PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if (MuteSound)
{
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0x80); //Chanel Front Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xA0); //Chanel Front Right;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xC0); //Chanel Rear Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xE0); //Chanel Rear Right;
}
else
{
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FL | 0x80); //Chanel Front Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FR | 0xA0); //Chanel Front Right;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RL | 0xC0); //Chanel Rear Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RR | 0xE0); //Chanel Rear Right;
}
if (PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止 */
}
void SelectInput(u8 Inpute)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x43);//(Inpute & 0x03) | 0x40);
//0x42 chanel3 0x43 chanel4
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
Origin_FL = FL;
Origin_FR = FR;
Origin_RL = RL;
Origin_RR = RR;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(FL | 0x80); //Chanel Front Left;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(FR | 0xA0); //Chanel Front Right;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(RL | 0xC0); //Chanel Rear Left;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(RR | 0xE0); //Chanel Rear Right;
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetBass(u8 Bass)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x6F);//(Bass & 0xF) | 0x60);
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetTreble(u8 Treble)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x7F);//(Treble & 0xF) | 0x70);
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void PT2312Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = PT2312_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(PT2312_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PT2312_I2C_Stop();
}
#ifndef __PT2312_Driver_H
#define __PT2312_Driver_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#define PT2312_ADDRESS 0x88
#define PT2312_PORT GPIOB
#define PT2312_SCL_PIN GPIO_Pin_5
#define PT2312_SDA_PIN GPIO_Pin_15
#define PT2312_SCL_H PT2312_PORT->BSRR = PT2312_SCL_PIN
#define PT2312_SCL_L PT2312_PORT->BRR = PT2312_SCL_PIN
#define PT2312_SDA_H GPIOC->BSRR = PT2312_SDA_PIN
#define PT2312_SDA_L GPIOC->BRR = PT2312_SDA_PIN
#define PT2312_SCL_read PT2312_PORT->IDR & PT2312_SCL_PIN
#define PT2312_SDA_read GPIOC->IDR & PT2312_SDA_PIN
#define IN_MainAudio 3
#define IN_FMAudio 1
#define IN_BT 0
#define IN_Ext 2
void PT2312Init(void);
void SetVolume(u8 Value);
void Mute(u8 MuteSound); //MuteSound = 1 Mute the sound
void SelectInput(u8 Inpute);
void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR);
void SetBass(u8 Bass);
void SetTreble(u8 Treble);
#endif
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//#include <stm32f10x_lib.h>
#include "PT2312.h"
/********************************************************/
//extern void Systick_Delay_1ms(u32 nCount);
//static u8 Globe_Volume;
static u8 Origin_FL, Origin_FR, Origin_RL, Origin_RR;
void PT2312_I2C_delay(void)
{
u8 i = 50; //这里可以优化速度 ,经测试最低到5还能写入
while(i)
{
i--;
}
}
bool PT2312_I2C_Start(void)
{
PT2312_SDA_H;
PT2312_SCL_H;
PT2312_I2C_delay();
if(!PT2312_SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
PT2312_SDA_L;
PT2312_I2C_delay();
if(PT2312_SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
PT2312_SDA_L;
PT2312_I2C_delay();
return TRUE;
}
void PT2312_I2C_Stop(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_L;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
}
void PT2312_I2C_Ack(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_L;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SCL_L;
PT2312_I2C_delay();
}
void PT2312_I2C_NoAck(void)
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
PT2312_SCL_L;
PT2312_I2C_delay();
}
bool PT2312_I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
PT2312_SCL_L;
PT2312_I2C_delay();
PT2312_SDA_H;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
if(PT2312_SDA_read)
{
PT2312_SCL_L;
PT2312_I2C_delay();
return FALSE;
}
PT2312_SCL_L;
PT2312_I2C_delay();
return TRUE;
}
void PT2312_SendByte(u8 SendByte) //数据从高位到低位//
{
u8 i=8;
while(i--)
{
PT2312_SCL_L;
PT2312_I2C_delay();
if(SendByte&0x80)
{ PT2312_SDA_H; }
else
{ PT2312_SDA_L; }
SendByte<<=1;
PT2312_I2C_delay();
PT2312_SCL_H;
PT2312_I2C_delay();
}
PT2312_SCL_L;
}
void SetVolume(u8 Value)
{
if (Value > 63) Value = 63;
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Value & 0x3F);//0
if (PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void Mute(u8 MuteSound) //MuteSound = 1 Mute the sound
{
/* PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if (MuteSound)
{
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0x80); //Chanel Front Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xA0); //Chanel Front Right;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xC0); //Chanel Rear Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xE0); //Chanel Rear Right;
}
else
{
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FL | 0x80); //Chanel Front Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FR | 0xA0); //Chanel Front Right;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RL | 0xC0); //Chanel Rear Left;
if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RR | 0xE0); //Chanel Rear Right;
}
if (PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止 */
}
void SelectInput(u8 Inpute)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x43);//(Inpute & 0x03) | 0x40);
//0x42 chanel3 0x43 chanel4
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
Origin_FL = FL;
Origin_FR = FR;
Origin_RL = RL;
Origin_RR = RR;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(FL | 0x80); //Chanel Front Left;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(FR | 0xA0); //Chanel Front Right;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(RL | 0xC0); //Chanel Rear Left;
if(PT2312_I2C_WaitAck())
PT2312_SendByte(RR | 0xE0); //Chanel Rear Right;
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetBass(u8 Bass)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x6F);//(Bass & 0xF) | 0x60);
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void SetTreble(u8 Treble)
{
PT2312_I2C_Start();//开始
PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x7F);//(Treble & 0xF) | 0x70);
if(PT2312_I2C_WaitAck()) PT2312_I2C_Stop();//停止
}
void PT2312Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = PT2312_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(PT2312_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PT2312_I2C_Stop();
}
#ifndef __PT2312_Driver_H
#define __PT2312_Driver_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#define PT2312_ADDRESS 0x88
#define PT2312_PORT GPIOB
#define PT2312_SCL_PIN GPIO_Pin_5
#define PT2312_SDA_PIN GPIO_Pin_15
#define PT2312_SCL_H PT2312_PORT->BSRR = PT2312_SCL_PIN
#define PT2312_SCL_L PT2312_PORT->BRR = PT2312_SCL_PIN
#define PT2312_SDA_H GPIOC->BSRR = PT2312_SDA_PIN
#define PT2312_SDA_L GPIOC->BRR = PT2312_SDA_PIN
#define PT2312_SCL_read PT2312_PORT->IDR & PT2312_SCL_PIN
#define PT2312_SDA_read GPIOC->IDR & PT2312_SDA_PIN
#define IN_MainAudio 3
#define IN_FMAudio 1
#define IN_BT 0
#define IN_Ext 2
void PT2312Init(void);
void SetVolume(u8 Value);
void Mute(u8 MuteSound); //MuteSound = 1 Mute the sound
void SelectInput(u8 Inpute);
void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR);
void SetBass(u8 Bass);
void SetTreble(u8 Treble);
#endif
一周热门 更多>