E2E™ 设计支持
搜索
用户
站点
搜索
用户
E2E™ 中文设计支持 >
论坛
放大器
API 解答
音频
时钟和计时
数据转换器
DLP® 产品
接口
隔离
逻辑
微控制器
电机驱动器
处理器
电源管理
射频与微波
传感器
站点支持
开关与多路复用器
工具
无线连接
参考译文
存档组
存档论坛
技术文章
模拟
汽车
DLP® 技术
嵌入式处理
工业
电源管理
TI 培训
快速入门
English
更多
取消
存档论坛
其它模拟产品 (Read-Only)
论坛
提及
子组
标记
更多
Cancel
提出相关问题
什么是相关问题?
相关问题是指与本问题有关联性的问题,”相关问题“ 被创建后,会自动链接到当前的原始问题。
提出新问题
提出新问题
Cancel
状态
回复
4 回复
订户
9 订户
视图
2832 视图
用户
0 会员在此处
ADS8689
选项
标记
更多
取消
选项
共享
更多
取消
相关
ADS8689 程序
user4762775
Prodigy
250
points
Other Parts Discussed in Thread:
ADS8689
单片机SPI驱动ADS869读到的数据和发送不一致怎么回事
6 年多前
0
Kailyn Chen
6 年多前
TI__Guru****
295050
points
您好,很抱歉,没有提供ADS8689的程序可供参考。
或者建议您可到英文e2e论坛上咨询一下:
e2e.ti.com/.../73
取消
向上
0
True
向下
取消
0
user4762775
6 年多前
回复
Kailyn Chen
Prodigy
250
points
问题以解决贴上STM32驱动代码
uint8_t busy_flag = IDLE_STATUS;
/**
* @brief adc spi GPIO配置
* @param None
* @param None
* @return None
*/
void adc_spi_gpio(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置 SPI引脚SCK、MISO 和 MOSI为复用推挽模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = PIN_SCK|PIN_MISO|PIN_MOSI;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
* @brief adc 外设配置
* @param None
* @param None
* @return None
*/
void adc_spi_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_Cmd(SPI1, DISABLE); /* 先禁止SPI */
/* 配置SPI硬件参数 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; /* 数据方向:2线全双工 */
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; /* STM32的SPI工作模式 :主机模式 */
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; /* 数据位长度 : 8位 */
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; /* 时钟上升沿采样数据 */
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; /* 时钟的第1个边沿采样数据 */
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; /* 片选控制方式:软件控制 */
/* 设置波特率预分频系数 SPI_BaudRatePrescaler_8 ,实测SCK周期 96ns, 10.4MHz */
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* 数据位传输次序:高位先传 */
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE); /* 使能SPI */
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_TXE);
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
}
/**
* @brief ads8689_read_write(uint16_t ch)
* @param data :要发送的数据
* @return 返回收到的数据
*/
uint16_t ads8689_read_write(uint16_t data)
{
/* 等待发送缓冲区为空,TXE 事件 */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
/**
* @brief ads8689_int()
* @param 8689的初始化
* @return
*/
void ads8689_int(void)
{
adc_spi_gpio();
adc_spi_init();
}
/**
* @brief delay_5us()
* @param count :要延迟的时间
* @retval
*/
void delay_us(uint16_t count)
{ uint16_t i=72*count;
while(i--)
{
__ASM("NOP");
}
}
/**
* @brief ads8689_write_cmd(uint16_t cmd_hi,uint16_t cmd_li)
* @param li_data :要发送的低位数据
* @param hi_data :要发送的高位数据
* @return 返回收到的数据
*/
uint8_t ads889_busy_set(uint8_t busy)
{
uint8_t ret = 0;
switch(busy)
{
/*空闲状态*/
case IDLE_STATUS:
busy_flag = IDLE_STATUS;
ADS8689_DISABLE;
break;
/*忙状态*/
case BUSY_STATUS:
busy_flag = BUSY_STATUS;
ADS8689_ENABLE;
break;
default:
ret = 1;
break;
}
return ret;
}
/**
* @brief uint8_t get_busy_status(void)
* @param 无
* @return 返回 busy_flag IDLE_STATUS / BUSY_STATUS
*/
uint8_t get_busy_status(void)
{
return busy_flag;
}
/**
* @brief ads8689_write_cmd(uint16_t cmd_hi,uint16_t cmd_li)
* @param li_data :要发送的低位数据
* @param hi_data :要发送的高位数据
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t ads8689_write_cmd(uint16_t cmd_hi,uint16_t cmd_li)
{
uint8_t ret;
/*ADS8986使能*/
if(ads889_busy_set(BUSY_STATUS)) //设置成功为 0
{
ret = 1;
return ret;
}
else{
ads8689_read_write(cmd_hi);
ads8689_read_write(cmd_li);
ret = 0;
}
if(ads889_busy_set(IDLE_STATUS)) //设置成功为 0
{
ret = 1;
return ret;
}
return ret;
}
/**
* @brief conv_state(void)
* @param 无
* @param 无
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t conv_state(void)
{
uint8_t ret;
/*ADS8986使能*/
if(ads889_busy_set(BUSY_STATUS)) //设置成功为 0
{
ret = 1;
return ret;
}
else{
ret =0;
delay_us(5);
}
if(ads889_busy_set(IDLE_STATUS)) //设置成功为 0
{
ret = 1;
return ret;
}
return ret;
}
/**
* @brief ads8689_read_data(uint16_t hi_data,uint16_t li_data,uint32_t * result)
* @param li_data :要发送的低位数据
* @param hi_data :要发送的高位数据
* @param result :寄存器读到的结果通过指针传出
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t ads8689_read_data(uint16_t hi_data,uint16_t li_data,uint32_t * result)
{
uint8_t ret;
uint32_t value;
/*ADS8986使能*/
if(ads889_busy_set(BUSY_STATUS)) //设置成功为 1
{
ret = 1;
return ret;
}
else{
value = ads8689_read_write(hi_data);
value =value<<16;
value += ads8689_read_write(li_data);
*result = value;
ret = 0;
}
if(ads889_busy_set(IDLE_STATUS)) //设置成功为 0
{
ret = 1;
return ret;
}
return ret;
}
/**
* @brief uint8_t device_id(uint16_t *id)
* @param id :寄存器读到的结果通过指针传出
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t device_id(uint16_t *id)
{
uint8_t ret = 0;
uint32_t reslut;
if(ads8689_write_cmd(0xc800,0x0000))
{
ret =1;
return ret;
}
if(ads8689_read_data(0,0,&reslut))
{
ret =1;
return ret;
}
*id = (reslut>>16);
return ret;
}
/**
* @brief uint8_t measured_value(uint32_t *reslut)
* @param reslut :寄存器读到的结果通过指针传出
* @param num :采集次数
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t measured_value(uint32_t *reslut,uint16_t num)
{
// uint16_t set_value = PAR_EN | RANGE_INC | IN_ACTIVE_ALARM_INCL
// |VDD_ACTIVE_ALARM_INCL|DEVICE_ADDR_INCL;
uint16_t get_reslut[255]={0};
uint32_t value =0;
uint8_t ret =0;
uint16_t i = 0;
for(i = 0; i < num; i ++)
{
if(ads8689_write_cmd(0x0000,0))
{
ret =1;
return ret;
}
if ( ads8689_read_data(0,0,&value))
{
ret =1;
return ret;
}
value = ((value >>16) & 0x0000ffff);
get_reslut[i] = value;
}
value =0;
for(i = 0; i < num;i ++)
{
value += get_reslut[i];
}
*reslut = value/num;
return ret;
}
/**
* @brief uint8_t in_rang_select(uint16_t cmd)
* @param cmd :INT_30VREF (3*vref ) INT_25VREF (2.5*vref )
INT_15VREF (1.5*vref ) INT_125VREF (1.25*vref )
* @return 成功与失败 0:设置成功 1:设置失败
*/
uint8_t in_rang_select(uint16_t cmd)
{
uint8_t ret =0;
uint32_t reslut;
if(ads8689_write_cmd(0xd014,cmd))
{
ret =1;
return ret;
}
if(ads8689_write_cmd(0xc814,0))
{
ret =1;
return ret;
}
if ( ads8689_read_data(0,0,&reslut))
{
ret =1;
return ret;
}
else
{
if ((reslut>>16) == cmd)
{
ret =0;
return ret;
}
else
{
ret =1;
return ret;
}
}
return ret;
}
取消
向上
0
True
向下
取消
0
z z2
5 年多前
回复
user4762775
Prodigy
20
points
.h 文件可以贴一下吗
取消
向上
0
True
向下
取消
0
z z2
5 年多前
回复
user4762775
Prodigy
20
points
1451999625@qq.com 能否分享下工程文件,万分感谢
取消
向上
0
True
向下
取消