完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我编的程序始终无法启动TM7705转换,通过SPI写入的数据从寄存器中读出都是错误的,希望有用过的人帮忙看看我的程序!
头文件: /* * TM7705.h * * Created: 2014/3/11 0:03:28 * Author: 000 */ #ifndef TM7705_H_ #define TM7705_H_ #include #include til/delay.h> #include "User_LED.h" #define DRDY 3 //从机就绪输入 #define SS 4 //从机片选输出 #define MOSI 5 //主机数据输出 #define MOSO 6 //主机数据输入 #define SCK 7 //主机时钟输出 #define TM7705_Enable() (PORTB &=~_BV(SS))//使能TM7705 #define TM7705_Disable() (PORTB |=_BV(SS))//失能TM7705 #define Wait_TM7705() while(PINB&0X08)//监视转换 #define CH1 0X00 //通道1 #define CH2 0X01 //通道2 void SPI_Port_Init( void ); void SPI_Init( void ); uint8_t TM7705_Write( uint8_t Data ); void TM7705_Init( void ); uint8_t TM7705_Read_Byte( uint8_t Register_number ); uint16_t TM7705_Read_16bit( uint8_t Channel ); #endif /* TM7705_H_ */ C文件: /* * TM7705.c * * Created: 2014/3/11 0:01:07 * Author: 000 */ #include "TM7705.h" /*-------------------ATmage16 SPI端口控制TM7705--------------------*/ /*-------------------------端口接线示意图--------------------------*/ /*ATmage16 SPI端口 TM7705端口 *PB4(SS) 从机控制端口--------------------------Pin4(CS) *PB5(MOSI) 主机数据输出--------------------------Pin14(DIN) *PB6(MOSO) 主机数据输入--------------------------Pin13(DOUT) *PB7(SCK) 主机时钟输出--------------------------Pin1(SCLK) *PB3 监视TM7705---------------------------Pin12(DRDY) */ /****************************************************** *函数名:SPI_Port_Init *参数: *返回值:PB3检测TM7705_DRDY *说明:SPI端口初始化 ******************************************************/ void SPI_Port_Init( void ) { /*设置PB4(SS),PB5(MOSI),PB7(SCK)为输出*/ DDRB |= _BV(SCK)|_BV(SS)|_BV(MOSI); /*PB6(MOSO)为输入,PB3—TM7705转换完成信号*/ DDRB &= ~(_BV(MOSO)|_BV(DRDY)); /*输入端口的上拉电阻使能*/ PORTB |= _BV(DRDY)|_BV(MOSO)|_BV(SS)|_BV(SCK); } /****************************************************** *函数名:SPI_Init *参数:无 *返回值:无 *说明:SPI初始化为主机模式 ******************************************************/ void SPI_Init( void ) { /*使能SPI,MSB先收发,选择主机模式,时钟空闲时为高电平*/ /*系统时钟128分频*/ SPCR |= _BV(SPE)|_BV(MSTR)|_BV(CPOL)|_BV(SPR0)|_BV(SPR1); SPSR = 0X00; } /****************************************************** *函数名:TM7705_Read_Byte *参数:Register_number *返回值: *说明:从TM7705中指定的寄存器中读取一字节数据 ******************************************************/ uint8_t TM7705_Read_Byte( uint8_t Register_number ) { uint8_t SPI_Data=0; TM7705_Enable(); TM7705_Write(0X08|(Register_number<<4)); SPI_Data = TM7705_Write(0XFF); //通过发送数据来读取一个字节的数据 TM7705_Disable(); return SPI_Data; } /****************************************************** *函数名:TM7705_Reset *参数: *返回值: *说明:复位TM7705 ******************************************************/ void TM7705_Reset( void ) { uint8_t num; for ( num=10;num>0;num-- ) { TM7705_Write(0XFF); } } /****************************************************** *函数名:TM7705_Read_16bit *参数:Channel可以是CH1,CH2 *返回值: *说明:读取一次TM7705的通道Channel转换数据 ******************************************************/ uint16_t TM7705_Read_16bit( uint8_t Channel ) { uint16_t Read_Data=0; TM7705_Enable(); TM7705_Write(0X38|Channel); //读取当前通道数据 Wait_TM7705(); //等待转换结束 //为何总是等待不到结束 Read_Data = TM7705_Write(0XFF); //读取当前通道数据高八位 Read_Data <<= 8; Read_Data |= TM7705_Write(0XFF);//读取当前通道数据低八位 TM7705_Disable(); return Read_Data; } /****************************************************** *函数名:TM7705_Write *参数:Data,要发送的参数 *返回值:从机中返回的数据 *说明:SPI接口完成一次数据交换 ******************************************************/ uint8_t TM7705_Write( uint8_t Data ) { SPDR = Data; while(!(SPSR>>SPIF));//等待发送完成 return SPDR; } /****************************************************** *函数名:TM7705_Init *参数:无 *返回值: *说明:TM7705初始化 ******************************************************/ void TM7705_Init( void ) { SPI_Port_Init(); //SPI端口初始化 SPI_Init(); //初始化SPI为主机模式 TM7705_Enable(); TM7705_Reset(); //复位TM7705 TM7705_Write(0X20);//选择时钟寄存器 TM7705_Write(0X0E);//设置时钟寄存器,主频4.9125MHz进行二分频,250Hz转换 TM7705_Write(0X40);//选择测试寄存器 TM7705_Write(0X01);//设置测试寄存器,使用内部基准 TM7705_Write(0X00);//选择通信寄存器并且设置为通道一 TM7705_Write(0X10);//选择设置寄存器 TM7705_Write(0X47);//设置设置寄存器,增益为1进行自校准模式 Wait_TM7705(); //等待校准结束 //为何等待总是不能完成 //TM7705_Write_Byte(0,0X01); //设置通信寄存器,选择通道2 //TM7705_Write_Byte(1,0X47); //设置设置寄存器,增益为1,进行自校准模式 //Wait_TM7705(); //等待校准结束 TM7705_Disable(); } |
|
相关推荐
3个回答
|
|
问题你自己都解决啦,相位设置问题。用到while最好就控制一下运行时间,防止程序死在那里。
|
|
|
|
逻辑输出。这个输出端上的逻辑低电平表示可从 TM7705 的数据寄存器获取新的输出字。完成对一个完全的输出字的读操作后,DRDY 引脚立即回到高电平。如果在两次输出更新之间,不发生数据读出,DRDY 将在下一次输出更新前 500 ×tCLKIN 时间返回高电平。当 DRDY 处于高电平时,不能进行读操作,以免数据寄存器中的数据正在被更新时进行读操作。当数据被更新后,DRDY 又将返回低电平。DRDY 也用来指示何时TM7705 已经完成片内的校准序列
程序好像没有监控这个引脚的状态? |
|
|
|
有监视的,不然没法判断何时读数据,再就是使用过程中失步太严重,后来修改的程序使用每次转换前都发送复位通信时钟信号(不是通过复位引脚复位,因为这样复位导致初始化后的寄存器也复位了)在转换读出数据很少出错,再就是TM7705不知道为什么开启了内部基准但还是不行,所以我就使用外部基准了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11770 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 14:58 , Processed in 0.612306 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号