Both work. I would use the first if there is no opportunity to speak to Joe anymore (the day is over, or we know he will be unavailable etc.), otherwise I would use the second.
-- Did you speak to Joe today?
-- No, I was too busy.
-- Come on, he will be on business trip for two weeks, and you couldn't find a minute to clear up that point!
-- Have you spoken to Joe today?
-- Not yet, I'll catch him this afternoon first thing.