[其他产品] 求证ATmega16与TLC5618的D/A数模转换哪里不对

[复制链接]
 楼主| classroom 发表于 2024-12-16 14:49 | 显示全部楼层 |阅读模式
#include
#include   
#define uint unsigned int
#define uchar unsigned char
#define   SPIF   7
#define   ss     4    //PB4
#define   mosi   5   //PB5
#define   sck    7   //PB7
void spi_init()  //初始化
{
    DDRB=0xFF;   //端口设置?不懂为啥这样设
    PORTB=0x00;  //这是PB全为高电位输出:即SCK,MOSI为高电位初始化
    SPSR=0x00;  //状态寄存器全0,这是为啥
        SPCR=0x50;   //主机模式 方式1 ocs/16   SPI控制寄存器设置01010101,一般情况需要改动吗?
}
void  DAC_TLV5618(uint temp)
{
        PORTB&=~(1<         SPDR=(uchar)( temp&&0xff00)>>8;
        while(!SPSR&(1<         SPSR=(uchar)( temp&&0x00ff);
        while(!SPSR&(1<         //PORTB|= (1< }
void main()
{
        //delay_ms(500);
        spi_init();
        DAC_TLV5618(0x4800);
        while(1);
}
xuanhuanzi 发表于 2024-12-19 11:04 来自手机 | 显示全部楼层
Spi接口就看时序啊
稳稳の幸福 发表于 2024-12-21 17:51 | 显示全部楼层
SPI配置对了吗?这个你先确保SPI是对的
小灵通2018 发表于 2024-12-25 14:37 | 显示全部楼层
这个系列支持MCC不支持啊?
小灵通2018 发表于 2024-12-25 14:37 | 显示全部楼层
你这个写法也没法看啊,你要按照SPI协议写啊,先定义好拉低拉高的宏啊。
dongnanxibei 发表于 2024-12-25 20:36 来自手机 | 显示全部楼层
这个应该跟TLC2543一样操作的吧?
稳稳の幸福 发表于 2024-12-29 12:32 | 显示全部楼层
要抽象出来啊,你这么做,很难看懂。
lamanius 发表于 2025-2-18 12:49 | 显示全部楼层
DDRB = 0xFF 将 PORTB 的所有引脚设置为输出模式。但对于 SPI 通信,MISO(主输入从输出)引脚应该是输入模式。DDRB = (1 << mosi) | (1 << sck) | (1 << ss);  // 仅设置 MOSI、SCK 和 SS 为输出模式
ex7s4 发表于 2025-2-18 14:06 | 显示全部楼层
SPCR = 0x50 的设置可能不正确。0x50 对应的二进制是 01010000,表示:SPI 使能(SPE = 1)。机模式(MSTR = 1)。时钟极性(CPOL = 0)。钟相位(CPHA = 0)。时钟分频(SPR1:0 = 00,即 fosc/4)。根据 TLC5618 的时序要求,可能需要调整时钟极性和相位。通常 TLC5618 使用 CPOL = 0 和 CPHA = 0,但时钟分频可能需要调整。
b5z1giu 发表于 2025-2-18 15:19 | 显示全部楼层
SPSR = (uchar)(temp & 0x00ff); 是错误的。SPSR 是状态寄存器,不能直接赋值。temp & 0xff00 和 temp & 0x00ff 的位操作有误。while (!(SPSR & (1 << SPIF))); 的写法不标准。
suw12q 发表于 2025-2-18 16:21 | 显示全部楼层
DAC_TLV5618(0x4800); 的调用是正确的,但缺少延时或其他操作,可能导致无法观察到输出变化。其实可以添加延时或循环输出不同的值
w2nme1ai7 发表于 2025-2-18 20:35 | 显示全部楼层
TLC5618 的时序,确保 SPI 的时钟频率和时序符合 TLC5618 的要求。
g0d5xs 发表于 2025-2-18 21:42 | 显示全部楼层
电源和地连接,检查 TLC5618 的电源和地是否连接正确
d1ng2x 发表于 2025-2-18 22:58 | 显示全部楼层
参考电压,确保 TLC5618 的参考电压(VREF)设置正确
tax2r6c 发表于 2025-2-19 09:16 | 显示全部楼层
你去找个D/A这个芯片的相关的驱动函数啊
p0gon9y 发表于 2025-2-19 10:22 | 显示全部楼层
这种寄存器的操作,不懂啊,不过你可以看看你的SPI这方面
kaif2n9j 发表于 2025-2-19 12:50 | 显示全部楼层
端口设置是配置SPI,就默认的就行,一般来说
慢醇 发表于 2025-2-23 00:04 | 显示全部楼层
SPSR 是 SPI 状态寄存器,会在 SPI 工作时由硬件自动更新。直接置为 0x00 没必要,可能会影响 SPI 通信。一般来说SPSR 无需直接操作。
jiekou001 发表于 2025-2-26 16:17 | 显示全部楼层
解决了吗?
jiekou001 发表于 2025-2-26 16:18 | 显示全部楼层
你试试下面的代码
  1. #define uint unsigned int
  2. #define uchar unsigned char
  3. #define   SPIF   7
  4. #define   ss     4    // PB4
  5. #define   mosi   5    // PB5
  6. #define   sck    7    // PB7

  7. void spi_init()  // 初始化
  8. {
  9.     DDRB |= (1 << mosi) | (1 << sck) | (1 << ss);  // 设置MOSI, SCK, SS为输出
  10.     PORTB |= (1 << ss);  // SS引脚初始化为高电平
  11.     SPSR = 0x00;  // 状态寄存器清零
  12.     SPCR = 0x50;  // 主机模式,时钟速率为fosc/16
  13. }

  14. void DAC_TLV5618(uint temp)
  15. {
  16.     PORTB &= ~(1 << ss);  // 拉低SS引脚
  17.     SPDR = (uchar)((temp & 0xff00) >> 8);  // 发送高字节
  18.     while (!(SPSR & (1 << SPIF)));  // 等待传输完成
  19.     SPDR = (uchar)(temp & 0x00ff);  // 发送低字节
  20.     while (!(SPSR & (1 << SPIF)));  // 等待传输完成
  21.     PORTB |= (1 << ss);  // 拉高SS引脚
  22. }

  23. void main()
  24. {
  25.     spi_init();
  26.     DAC_TLV5618(0x4800);  // 发送数据到DAC
  27.     while (1);
  28. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

524

主题

3256

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部