OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4113|回复: 2

AD5671A的SPI通信(用的STM32F4)

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-4-12
在线时间
4 小时
发表于 2022-1-6 17:12:34 | 显示全部楼层 |阅读模式
19金钱


如何发出连续的24位?
void ad5761r_write(uint8_t reg_addr_cmd,uint16_t reg_data)
{
        uint8_t data[3];
        data[0] = reg_addr_cmd;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//μè′y·¢ËíÇø¿Õ   
        SPI_I2S_SendData(SPI1, data[0]);   //·¢ËíμçÑ1Öμ
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
        
        data[1] = (reg_data & 0xFF00) >> 8;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//μè′y·¢ËíÇø¿Õ   
        SPI_I2S_SendData(SPI1, data[1]);   //·¢ËíμçÑ1Öμ
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
        
        data[2] = (reg_data & 0x00FF) >> 0;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//μè′y·¢ËíÇø¿Õ   
        SPI_I2S_SendData(SPI1, data[2]);   //·¢ËíμçÑ1Öμ
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);        
}

void AD5541A_control(u16 date1)
{
        AD5541A_LDAC=0;   //LDAC½óDAC£¬¼Ä′æÆ÷êμê±êäèë¸üDÂ
        AD5541A_SYNC=1;   //syncà-¸ß
        delay_us(1);
        AD5541A_SYNC=0;   //syncà-μí
        delay_us(1);
        ad5761r_write(CMD_WR_CTRL_REG,date1);
        delay_us(1);
        AD5541A_SYNC=1;   //syncà-¸ß
        }
//·¢ËíμçÑ1
void AD5541A_WRITE(u16 voltage)   
{  
        AD5541A_LDAC=0;   //LDAC½óDAC£¬¼Ä′æÆ÷êμê±êäèë¸üDÂ
        AD5541A_SYNC=1;   //syncà-¸ß
        delay_us(1);
        AD5541A_SYNC=0;   //syncà-μí
        delay_us(1);
        ad5761r_write(CMD_WR_UPDATE_DAC_REG,voltage);
        delay_us(1);    //2»¼óò2¿éòÔ°é
        AD5541A_SYNC=1;   //syncà-¸ß
        }

自己用GPIO写的周期太大了
void AD5541Awrite(unsigned char count, unsigned char *data)
{
        unsigned char ValueToWrite = 0;
    unsigned char i = 0;
        unsigned char j = 0;
        SCLK_H;
        for(i=1;i<(count+1);i++)
        {
                 ValueToWrite = *(data + i - 1);
                for(j=0; j<8; j++)
                {
                        if(0x80 == (ValueToWrite & 0x80))
                        {
                                MOSI_H;          //ê&#228;3&#246;&#184;&#223;μ&#231;&#198;&#189;
                        }
                        else
                        {
                                MOSI_L;          //ê&#228;3&#246;μíμ&#231;&#198;&#189;
                        }
                        delay_us(1);
                        SCLK_L;
                        delay_us(1);
                        ValueToWrite <<= 1;        //Rotate data
                        SCLK_H;
                }
        }
        MOSI_H;
}




芯片时序图







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-1-9 01:33:33 | 显示全部楼层
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2022-1-9 20:59:50 | 显示全部楼层
按楼主的模式,spi 8bit3字节读取,应该是没问题,虽然字节之间时间间隔比较大。spi是同步通信,根据时钟来。参考实现:
https://acuity.blog.csdn.net/article/details/79043934
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表